繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM