运行以下行后:
double d=Float.parseFloat("9.99");
System.out.println(""+d);
我得到这个:9.989999771118164
我预计会看到:9.99
为什么以及如何解决这个问题?
============================================= ========
编辑:我应该使用的是:double d=Double.parseDouble("9.99") 打印出 9.99。那是我的错,但是看到详细的答案很有趣,谢谢!
最佳答案
如果您想要精确的十进制值,请使用 BigDecimal
.否则,了解二进制 float 是如何工作的,并准备好处理后果。 (当然,即使是 BigDecimal
也不能准确表示“三分之一”。)
请注意,调用 Float.parseFloat
很奇怪, 但将结果分配给 double
... 将结果分配给 float
会更常见或者 或使用Double.parseDouble
开始。然而,无论哪种情况,结果都不会正好是 9.99。数字 9.99 不能精确地用二进制 float 表示,就像 1 除以 3 的结果不能精确地用十进制表示一样。
我没有任何关于 Java 二进制浮点的文章,但它和 C# 二进制浮点之间应该没有任何真正显着的区别,我确实有 an article about .
您应该使用哪种类型实际上取决于您所表示的语义。我使用一个经验法则,人为的“人工”值(例如金钱)最好以十进制格式表示(例如 BigDecimal
),而“自然”值(例如高度和宽度)更适合用 float
表示。/double
.
关于java - 为什么在 Java 中解析 double 创建新数字?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5222354/