[英]Wrong Decimal Converting from Double to String in java
我有一个格式正确的字符串,可以转换为double,它适用于大多数小数。 问题是对于.33,.67,以及可能还有其他我未测试过的,小数点变为.6700000000002
或.329999999998
。 我理解为什么会发生这种情况但是有人建议修复它。
这是IEEE-754舍入规则的结果,有些数字不能用二进制补码精确表示。 例如, 1/10
不能精确表示。
您可以使用BigDecimal添加更多精度(但不是无限)。
BigDecimal oneTenth = new BigDecimal("1").divide(new BigDecimal("10"));
System.out.println(oneTenth);
哪个输出0.1
使用内部基本2机器表示无法准确表示某些十进制数字。
这对你来说是双精度的。 二进制数和小数不能很好地协同工作。 除非你正在做一些非常精确的事情,否则应该没问题,如果要打印它,你应该使用十进制格式或printf。
浮点数的值不是直接存储,而是存储指数值。 您可以将3.1233453456356写为数字,但这会在内存中存储类似3和2 ^ 6的内容。 它会尝试存储与您的数字一样接近的值,但这些差异可能会发生。
除非你正在测试平等,否则它应该不是问题。 对于相等的浮点测试,您需要允许“delta”,以便:
if (a == b)
变
if (abs(a-b) < 0.000001)
或类似的小delta值。 对于打印,将其限制为两位小数,格式化程序将为您舍入。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.