【发布时间】:2014-02-10 20:59:55
【问题描述】:
我正在使用 BigDecimal 来处理我的应用程序中的正数,并且我想让它截断第 4 位之后的小数。 我似乎几乎可以通过 RoundingMode.DOWN 找到我想要的东西,但是当 BigDecimal 是从双精度创建时会出现一些问题。
例如:
System.out.println("123.11119 = " + new BigDecimal("123.11119").setScale(4, RoundingMode.DOWN)); //Print 123.1111 which is exactly what I want
System.out.println("123.1111 = " + new BigDecimal("123.1111").setScale(4, RoundingMode.DOWN)); //So does this one
但是,以下打印 123.1110 这根本不是我想要的:
System.out.println("123.1111 = " + new BigDecimal(123.1111d).setScale(4, RoundingMode.DOWN));
【问题讨论】:
-
问题是
123.1111d可能被存储为123.111099999999,从而得到你的问题。 -
是的。不要从双精度数创建 BigDecimals。
-
@DavidWallace 为什么?原来的双精度仍然不准确。
-
因为将其转换为 String 具有正确的智能来选择小数位数最少的数字,该数字在四舍五入到该双精度的范围内。这意味着它将选择您真正想要的值。例如,
Double.toString(123.1111)将为您提供"123.1111"。当您的值已经为双倍时,这是唯一合理的做法。自然,您应该避免将十进制数字存储为双精度数,但如果数据来自您无法控制的某个来源,您并不总是有选择的余地。
标签: java double rounding bigdecimal