1

出力を切り捨てる必要がある問題を解決していましたが、驚いたことに、Javaで数値を切り捨てる方法を見つけることができませんでした。

出力は、数値の後に小数点以下6桁が続く必要があります。

私が欲しいのは double truncate(double number,int places)、出力は truncate(14/3.0) = 4.666666です。

しかし、私が得ているのは

public static double round(double value, int places) {
    if (places < 0) throw new IllegalArgumentException();

    long factor = (long) Math.pow(10, places);
    value = value * factor;
    long tmp = Math.round(value);
    return (double) tmp / factor;
  }
// rounds( 14/3.0 , 6 ) = 4.666667

String.format私が得ると

String.format("%.6f", 14/3.0) = 4.666667

また、Stackoverflowで見つけた、BigDecimalの使用を提案し、まったく同じ答えが得られたソリューションを試しました。

NumberFormat同様に機能するようです

java.text.NumberFormat f = java.text.NumberFormat.getNumberInstance();
f.setMinimumFractionDigits(6);
System.out.println(f.format(14/3.0)); // 4.666667

これを行う組み込みのメソッドはありますか、それともBigIntegerのようなものを使用して独自のメソッドを作成する必要がありますか?私が間違っていることはありますか?

4

3 に答える 3

5

これは、切り捨てではなく丸めているためです。

long tmp = Math.round(value);

代わりにキャストを使用すると、機能するはずです。

long tmp = (long) value;

したがって、以下のコード4.666666は期待どおりに出力されます。

public static void main(String[] args) throws Exception {
    System.out.println(truncate(14/3.0, 6));
}

public static double truncate(double value, int places) {
    if (places < 0) {
        throw new IllegalArgumentException();
    }

    long factor = (long) Math.pow(10, places);
    value = value * factor;
    long tmp = (long) value;
    return (double) tmp / factor;
}
于 2012-12-06T17:42:27.407 に答える
1

ダブルスには小数点以下の桁数がありません。特定の数に切り捨てることはできません。彼らはバイナリの場所を持っています。特定の小数表現が必要な場合は、DecimalFormatまたはを使用してくださいBigDecimal.

于 2012-12-07T00:50:25.460 に答える
0

次のコードは、double値の小数点以下の桁数を制限(切り捨て)するのに役立ちました。

public static Double truncate (double valueToTruncate, int numberOfDecimalPlaces) {

if (valueToTruncate > 0) {
    return new BigDecimal(String.valueOf(valueToTruncate)).setScale(numberOfDecimalPlaces, BigDecimal.ROUND_FLOOR).doubleValue();
} else {
    return new BigDecimal(String.valueOf(valueToTruncate)).setScale(numberOfDecimalPlaces, BigDecimal.ROUND_CEILING).doubleValue();
}

}

これが誰かに役立つことを願っています:)

于 2020-04-24T06:04:54.620 に答える