Ruby编号精度与简单算术

时间:2011-03-24 13:21:47

标签: ruby math precision floating-accuracy

我正在学习Ruby以获得乐趣,也用于创建网站(但这是无关紧要的)。在玩它时,我注意到一些“奇怪的”

当我用irb计算4.21 + 5时,它回答9.21(很奇怪,对吧?)

当我计算4.23 + 5时,它给出9.23(哇,这绝对是奇怪的)。

当我输入4.22 + 5时,它会回答9.21999 ......(等等......这真的很奇怪)。

因此我的问题是:发生了什么? 我理解这种行为与分裂或非常大的数字,但在这个简单的情况下.... ???

这是否意味着我无法使用Ruby开发会计应用程序? 是否有补丁或其他东西需要应用? (对我的大脑,最有可能)

2 个答案:

答案 0 :(得分:5)

您应该阅读计算机中的浮点表示。 This guide是一个很好的起点。这是它的缺点:

  

因为在内部,计算机使用a   格式(二进制浮点)   无法准确表示一个数字   像0.1,0.2或0.3一样。

     

编译代码时   解释,你的“0.1”已经存在   四舍五入到最接近的数字   格式,这导致一个小的   甚至在之前的舍入错误   计算发生了。

顺便说一下,我不确定你为什么认为4.21 + 5 = 9.21或4.23 + 5 = 9.23很奇怪。如果你认为它很奇怪,因为一个文字是一个整数,一个是浮点数,最终是一个浮动响应,这就是Ruby和其他一些语言处理数字类型差异的方式。如果Ruby降低了你的浮点数的精度并且只返回一个整数(9),那么它就不会很方便,所以任何整数文字都会被有效地改为浮点数。

至于在财务应用程序中使用浮点数,请查看Developing financial application。主要的内容是使用Decimal对象与Float。

答案 1 :(得分:1)

http://ruby-decimal.rubyforge.org/

这是你想在ruby中做可靠的浮点数学的包。 Developint Financial Applications链接没有引用它,但它使得在数据库中使用Decimal数据类型变得非常重要。

注意到这一点,因为对我来说这是不明显的:)