Ruby编号精度与简单算术

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

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

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

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

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

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

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

因为在内部,计算机使用的格式(二进制浮点)无法准确地表示0.1,0.2或0.3之类的数字。

编译或解释代码时,“0.1”已经四舍五入到该格式中最接近的数字,这甚至在计算发生之前就会导致小的舍入误差。

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

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

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

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

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