java - 为什么在 Java 中解析 double 创建新数字?

标签 java parsing double

运行以下行后:

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/

相关文章:

java - 使用 Apache Camel 记录到外部文件

java - 在java中以一定精度显示 double

objective-c - 将小数点限制在需要的范围内

java - 关于嵌套 Java try/finally 代码三明治的建议

java - org.openqa.selenium.WebDriverException : Error forwarding the new session cannot find : Capabilities

java - 如何从Java中的命令行获取变量?

mysql - BNF规则的解释

parsing - 如何将解析树简化为抽象语法树?

Java tryParseInt 最佳实践

c++ - 如何获得除法中带有十进制数的结果? C++, 树莓派