Java DecimalFormat 舍入错误?
Java DecimalFormat rounding error?
DecimalFormat
舍入数字的方式似乎有些不一致。
new DecimalFormat("0.0", new DecimalFormatSymbols(Locale.US)).format(number)
这是一些不同 number
值的返回值。
- 0.05 returns 0.0
- 0.15 returns 0.2
- 0.25 returns 0.2
- 0.35 returns 0.4
- 0.45 returns 0.4
为什么会这样?更重要的是,如何获得正确的值(0.25 舍入时为 0.3,0.45 舍入时为 0.5)?
Javadoc 指出:
DecimalFormat provides rounding modes defined in RoundingMode for formatting. By default, it uses RoundingMode.HALF_EVEN.
HALF_EVEN
的作用与您注意到的完全相同:当它刚好位于两个数字的中间时,它更喜欢四舍五入到最接近的偶数。 (出于多种原因,这很有用,主要是因为它不会平均偏高或偏低,倾向于平衡舍入误差。)
只需为您描述的行为致电 setRoundingMode(RoundingMode.HALF_UP)
。
DecimalFormat
舍入数字的方式似乎有些不一致。
new DecimalFormat("0.0", new DecimalFormatSymbols(Locale.US)).format(number)
这是一些不同 number
值的返回值。
- 0.05 returns 0.0
- 0.15 returns 0.2
- 0.25 returns 0.2
- 0.35 returns 0.4
- 0.45 returns 0.4
为什么会这样?更重要的是,如何获得正确的值(0.25 舍入时为 0.3,0.45 舍入时为 0.5)?
Javadoc 指出:
DecimalFormat provides rounding modes defined in RoundingMode for formatting. By default, it uses RoundingMode.HALF_EVEN.
HALF_EVEN
的作用与您注意到的完全相同:当它刚好位于两个数字的中间时,它更喜欢四舍五入到最接近的偶数。 (出于多种原因,这很有用,主要是因为它不会平均偏高或偏低,倾向于平衡舍入误差。)
只需为您描述的行为致电 setRoundingMode(RoundingMode.HALF_UP)
。