我有一个格式正确的字符串,可以转换为double,它适用于大多数小数。问题是对于.33,.67,以及可能还有其他我未测试过的问题,小数点变为.6700000000002
或.329999999998
。我理解为什么会发生这种情况,但任何人都有建议解决它。
答案 0 :(得分:4)
这是IEEE-754舍入规则的结果,有些数字无法在two's complement中精确表示。例如,1/10
无法准确表示。
您可以使用BigDecimal添加更多精度(但不是无限)。
BigDecimal oneTenth = new BigDecimal("1").divide(new BigDecimal("10"));
System.out.println(oneTenth);
哪个输出0.1
答案 1 :(得分:3)
使用内部基本2机器表示无法准确表示某些十进制数字。
答案 2 :(得分:1)
这对你来说是双重精确度。二进制数和小数不能很好地协同工作。除非你正在做一些非常精确的事情,否则应该没问题,如果要打印它,你应该使用十进制格式或printf。
答案 3 :(得分:1)
浮点数的值不是直接存储,而是以指数值存储。您可以将3.1233453456356写为数字,但这会在内存中存储类似3和2 ^ 6的内容。它试图存储一个与您的数字一样接近的值,但这些差异可能会发生。
答案 4 :(得分:1)
除非你测试平等,否则它应该不是问题。对于相等的浮点测试,您需要允许“delta”以便:
if (a == b)
变为
if (abs(a-b) < 0.000001)
或类似的小delta值。对于打印,将其限制为两位小数,格式化程序将为您舍入。