在java中错误的十进制从Double转换为String

时间:2014-01-03 17:35:09

标签: java android casting double

我有一个格式正确的字符串,可以转换为double,它适用于大多数小数。问题是对于.33,.67,以及可能还有其他我未测试过的问题,小数点变为.6700000000002.329999999998。我理解为什么会发生这种情况,但任何人都有建议解决它。

5 个答案:

答案 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值。对于打印,将其限制为两位小数,格式化程序将为您舍入。