我有一句简单的sop语句:
System.out.println(0.0000877979+0.3067846127);上面一行的输出是:0.30687241060000003
但是期望的是:0.3068724106
我怀疑,为什么最终会有额外的0000003出现。
发布于 2013-06-17 15:25:46
您需要理解什么是double数:它是一个二进制浮点数。因此,它不能精确地表示所有的十进制数。例如,以数字0.2为例。没有有限的二进制表示-就像没有有限的十进制表示1/3一样。
如果你对十进制数字感兴趣,那么你应该使用BigDecimal。然而,这实际上可能并不适合您正在尝试实现的目标。在您的案例中,这些数字意味着什么?它们是来自自然属性(体重,身高等)的测量值,还是“人工”的,自然的十进制值,如财务数据?这会影响您应该使用的类型。
BigDecimal与double在三个重要方面不同:
,
,
在构造BigDecimal时,重要的是从准确的值开始-将double转换为BigDecimal几乎总是错误的。因此,如果您将用户输入作为文本,这是很好的:
BigDecimal bd1 = new BigDecimal("0.0000877979");
BigDecimal bd2 = new BigDecimal("0.3067846127");
System.out.println(bd1.add(bd2)); // Prints 0.3068724106在其他情况下,您可以从另一个BigDecimal开始,也可以从一个整数开始。
发布于 2013-06-17 15:22:56
这是因为在二进制环境中使用浮点算法。有关更多信息,请查看此IEEE 754标准。
你应该使用BigDecimal类来指定。
使用BigDecimal.valueOf(value)将double转换为BigDecimal。
使用Double.toString( BigDecimal )方法提供的double的规范字符串表示将double转换为double。
发布于 2013-06-17 15:23:23
这是正常的,因为浮点数(Java语言中的float和double )的性质是有限的。请了解浮点算术(IEEE 754)。
要获得准确的数字,请在Java语言中使用BigDecimal。
https://stackoverflow.com/questions/17142280
复制相似问题