次の結果が必要です
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
.round()
または.setScale()
?これについてどうすればよいですか?
回答:
を使用setScale()
して、小数桁数をゼロに減らすことができます。value
丸められる値を保持すると仮定します。
BigDecimal scaled = value.setScale(0, RoundingMode.HALF_UP);
System.out.println(value + " -> " + scaled);
round()
保持する桁数を指定する必要があるため、使用は少し複雑になります。あなたの例では、これは3になりますが、これはすべての値に対して有効ではありません。
BigDecimal rounded = value.round(new MathContext(3, RoundingMode.HALF_UP));
System.out.println(value + " -> " + rounded);
(ただし、BigDecimal
オブジェクトが不変であり、両方setScale
とround
新しいオブジェクトを返します。)
BigDecimal bd1 = new BigDecimal(100.12); BigDecimal bd2 = bd1.setScale(0, RoundingMode.HALF_UP); System.out.println(bd1.equals(bd2));
falseを出力する
RoundingMode
それは何ですか?それはBigDecimal
グロドリゲスの答えで行くなら
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
これは出力です
100.23 -> 100
100.77 -> 101
それは私が望むものではないので、私はこれをやった。
System.out.println("" + value);
value = value.setScale(0, BigDecimal.ROUND_HALF_UP);
value = value.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("" + value);
これは私が得るものです
100.23 -> 100.00
100.77 -> 101.00
これは今のところ私の問題を解決します..:)ありがとうございます。
DecimalFormat
(のようにnew DecimalFormat("###.00")
)を使用しBigDecimal
て、文字列への変換を管理できます。"101.00"
@Grodriquezからのスニペットとあなたが作成した両方の値の結果が得られます。
これは非常に複雑な解決策ですが、うまくいきます:
public static BigDecimal roundBigDecimal(final BigDecimal input){
return input.round(
new MathContext(
input.toBigInteger().toString().length(),
RoundingMode.HALF_UP
)
);
}
テストコード:
List<BigDecimal> bigDecimals =
Arrays.asList(new BigDecimal("100.12"),
new BigDecimal("100.44"),
new BigDecimal("100.50"),
new BigDecimal("100.75"));
for(final BigDecimal bd : bigDecimals){
System.out.println(roundBigDecimal(bd).toPlainString());
}
出力:
100
100
101
101
input.toBigInteger().toString().length()
ような対数を使用することで、部分ははるかに効率的になりますround_up(log(input)) + (1 if input is a power of ten, else 0)
単に見てください:
http://download.oracle.com/javase/6/docs/api/java/math/BigDecimal.html#ROUND_HALF_UP
そして:
setScale(int precision, int roundingMode)
または、Java 6を使用している場合
http://download.oracle.com/javase/6/docs/api/java/math/RoundingMode.html#HALF_UP
http://download.oracle.com/javase/6/docs/api/java/math/MathContext.html
そしてどちらか:
setScale(int precision, RoundingMode mode);
round(MathContext mc);
1回のコマンドでそのように丸めることはできないと思います。試す
ArrayList<BigDecimal> list = new ArrayList<BigDecimal>();
list.add(new BigDecimal("100.12"));
list.add(new BigDecimal("100.44"));
list.add(new BigDecimal("100.50"));
list.add(new BigDecimal("100.75"));
for (BigDecimal bd : list){
System.out.println(bd+" -> "+bd.setScale(0,RoundingMode.HALF_UP).setScale(2));
}
Output:
100.12 -> 100.00
100.44 -> 100.00
100.50 -> 101.00
100.75 -> 101.00
残りの例をテストしたところ、必要な値が返されましたが、その正確性は保証できません。