0

数値を丸めるには、次のコードを使用します。

public static roundBd(BigDecimal bd){
  BigDecimal result1 = bd.setScale(0, RoundingMode.HALF_UP);
  return result1;
}
  • 入力 1.50 --> 出力 2
  • 入力 1.499 --> 出力 1

最初の結果は私にとっては問題ありませんが、2 番目の結果は私が期待したものではありません。1.499 の場合でも、出力 2 に含めたいと思います (詳細: 最初に 1.499 を 1.50 に丸め、次に 1.5 に丸め、最後に 2 に丸めます)。

しかし....

BigDecimal bd = new BigDecimal("1.499");  // I'd like to round it to 2
BigDecimal result1 = bd.setScale(2, RoundingMode.HALF_UP); // result1 == 1.50
BigDecimal result2 = bd.setScale(1, RoundingMode.HALF_UP); // result2 == 1.5
BigDecimal result3 = bd.setScale(0, RoundingMode.HALF_UP); // result3 == 1
4

2 に答える 2

3

それは丸めが機能する方法ではありません。HALF_UP は、数値が (スケールに応じて) 2 つの最も近い使用可能な値のちょうど中間にある場合、切り上げられることを意味します。それ以外は、最も近い値に丸められます。

javadocから抽出します。

両方の隣接点が等距離でない限り、「最も近い隣接点」に向かって丸める丸めモード

必要な動作に到達するには、連続して丸めることもできますが、そのような動作が必要な理由はわかりません。

BigDecimal bd = new BigDecimal("1.499");  // I'd like to round it to 2
BigDecimal result1 = bd.setScale(2, RoundingMode.HALF_UP); // result1 == 1.50
BigDecimal result2 = result1.setScale(0, RoundingMode.HALF_UP); // result2 == 2
于 2012-06-28T08:59:03.167 に答える
0

この結果はまさにあなたが得るべきものです。各中間を丸めると精度が低下するため、正しい桁数に直接丸めます。

本当に他の動作が必要な場合は、次のようにする必要があります

while(number.scale() > 0) {
  number.setScale(number.scale() - 1, RoundingMode.HALF_UP);
}
于 2012-06-28T09:00:54.650 に答える