我的输出是这样的 -
ruby-1.9.2-p290 :011 > 2.32 * 3
=> 6.959999999999999
我记得有时回到另一台机器上,我得到它...... 2.32 * 3 = 6
我的错误是什么? 非常感谢您阅读本文。 :)
答案 0 :(得分:7)
如果你真的想要向下舍入到整数,那么只需
(3 * 2.32).to_i
但我认为这不太可能。通常你只想将稍微不精确的浮点数格式化为类似这样的
"%0.2f" % (3 * 2.32)
=> "6.96"
如果您真的想使用确切的表示,那么您可以使用BigDecimal。
require 'BigDecimal'
(3 * BigDecimal.new("2.32")).to_s("F")
=> "6.96"
PS。建议阅读http://floating-point-gui.de/ DS。
答案 1 :(得分:4)
我不能告诉你关于Ruby的事情,所以请原谅我。但坦率地说,原则保持不变,所以我希望这会有所帮助:
Python 2.7.1 (r271:86832, Jun 16 2011, 16:59:05)
[GCC 4.2.1 (Based on Apple Inc. build 5658) (LLVM build 2335.15.00)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 2.32 * 3
6.959999999999999
正如您所看到的,Python也是如此。
System.out.println(2.32 * 3);
6.959999999999999
Java也一样!那有什么不对呢?
让我们尝试转移到BigDecimal
s:
System.out.println(new BigDecimal(2.32));
2.319999999999999840127884453977458178997039794921875
您在此处看到的是2.32
所指的实际。只是在大多数情况下print
或toString()
,或者您的语言用于将浮点数转换为字符串的任何内容,都会对数字进行舍入。
不精确的值,因为浮点数实际上是二进制表示的实数,而不是十进制数 - 这反过来使这些二进制文件重复,或重复出现。正如你可以猜到的那样,在有限的空间内重复真实是不可能的。
实际上,当我说上面的可怕小数是2.32
的意思时,我说谎了 - 正确的措辞是,“它是最接近的十进制Java可以近似{{1}的实际值}”。
在此处阅读更多内容:http://floating-point-gui.de/
答案 2 :(得分:3)