System.out.println(0.1 + 0.1 + 0.1); 或者即使我使用BigDecimal
System.out.println(new BigDecimal(0.1).doubleValue()
+ new BigDecimal(0.1).doubleValue()
+ new BigDecimal(0.1).doubleValue());我该如何解决这个问题呢?
发布于 2012-03-21 06:07:17
你真正想要的是
new BigDecimal("0.1")
.add(new BigDecimal("0.1"))
.add(new BigDecimal("0.1"));new BigDecimal(double)构造函数获得了double的所有不精确度,所以当您说0.1时,您已经引入了舍入误差。使用String构造函数可以避免与通过double进行操作相关的舍入错误。
发布于 2012-03-21 07:39:13
First never ,千万不要使用BigDecimal的双构造函数。这在某些情况下可能是正确的,但大多数情况下不是。
如果可以控制输入,请使用前面提出的BigDecimal字符串构造函数。这样你就能得到你想要的东西。如果您已经有了double (毕竟可能会发生),那么不要使用double构造函数,而要使用静态valueOf方法。这有一个很好的优势,那就是我们得到了double的规范表示,这至少减轻了问题。而且结果通常更直观。
发布于 2012-03-21 05:45:54
这不是Java的问题,而是一般计算机的问题。核心问题在于从十进制格式(人的格式)到二进制格式(计算机格式)的转换。有些十进制格式的数字在没有无限重复小数的情况下不能用二进制格式表示。
例如,0.01001100小数点等于0.01001100...但是一台计算机有一个有限的“槽”(位)来保存一个数字,所以它不能保存整个无穷大的表示。例如,它只节省了0.01001100110011001100。但以十进制表示的数字不再是0.3,而是0.30000000000000004。
https://stackoverflow.com/questions/9795364
复制相似问题