4

我的输出是这样的 -

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

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

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

4

3 回答 3

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

于 2011-10-20T21:13:19.123 回答
5

我不能告诉你关于 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 也是如此!那么它有什么问题呢?

让我们尝试移动到BigDecimals:

System.out.println(new BigDecimal(2.32));
2.319999999999999840127884453977458178997039794921875

您在此处看到的实际上2.32. 只是在大多数情况下print,或toString(),或您的语言用于将浮点数转换为字符串的任何内容,都会对数字进行四舍五入。

由于浮点数实际上是二进制表示的实数,而不是十进制数,因此值不准确——这反过来又使这些二进制数重复或重复出现。你可以猜到,在有限的空间里重复真实的东西永远不会是准确的。

实际上,当我说上面可怕的小数是什么意思时,我是在撒谎2.32——正确的措辞应该是,“它是 Java 可以得到的最接近的小数,以近似于”的实际值2.32

在这里阅读更多:http: //floating-point-gui.de/

于 2011-10-20T21:04:00.030 回答
3

您的问题只是Floats 不精确:

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

这并不是特定于语言的。

于 2011-10-20T20:56:15.983 回答