Fra*_*ank 1 java double parsing
运行以下行后:
double d=Float.parseFloat("9.99");
System.out.println(""+d);
Run Code Online (Sandbox Code Playgroud)
我得到了这个:9.989999771118164
我期待看到:9.99
为什么以及如何解决这个问题?
================================================== =====
编辑:我应该使用的是:double d = Double.parseDouble("9.99")打印出9.99.这是我的错,但看到详细的答案很有意思,谢谢!
Jon*_*eet 14
如果需要精确的十进制值,请使用BigDecimal.否则,了解二进制浮点的工作原理,并准备好应对后果.(当然,甚至BigDecimal不能完全代表"三分之一"之类的东西.)
请注意,这是很奇怪的来电Float.parseFloat,但分配结果的double......那将是更常见到任何结果赋值给一个float 或使用Double.parseDouble开始.然而,在任何一种情况下,结果都不会精确到9.99.数字9.99不能精确地以二进制浮点表示,而是除以三分之一的结果可以精确地以十进制表示来编写.
我没有关于特定的Java二进制浮点的任何物品,但不应该是和C#二进制浮点之间的任何真正显著的差异,这是我做的有关于...的文章.
您应该使用哪种类型实际上取决于您所代表的语义.我使用经验法则,人造"人工"价值(如金钱)最好以十进制格式表示(例如BigDecimal),而"自然"值(如高度和宽度)更适合作为float/ double.