Ruby - 乘法问题

时间:2011-10-20 20:53:12

标签: ruby ruby-on-rails-3.1 multiplication floating-point-precision

我的输出是这样的 -

ruby-1.9.2-p290 :011 > 2.32 * 3
=> 6.959999999999999

我记得有时回到另一台机器上,我得到它...... 2.32 * 3 = 6

我的错误是什么? 非常感谢您阅读本文。 :)

3 个答案:

答案 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所指的实际。只是在大多数情况下printtoString(),或者您的语言用于将浮点数转换为字符串的任何内容,都会对数字进行舍入。

不精确的值,因为浮点数实际上是二进制表示的实数,而不是十进制数 - 这反过来使这些二进制文件重复,或重复出现。正如你可以猜到的那样,在有限的空间内重复真实是不可能的。

实际上,当我说上面的可怕小数是2.32的意思时,我说谎了 - 正确的措辞是,“它是最接近的十进制Java可以近似{{1}的实际值}”。

在此处阅读更多内容:http://floating-point-gui.de/

答案 2 :(得分:3)

你的问题只是Float不精确:

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

这不是特定于语言的。