比较RubyonRails中两个几乎相同的BigDecimal数字

比较RubyonRails中两个几乎相同的BigDecimal数字,ruby,precision,equality,bigdecimal,Ruby,Precision,Equality,Bigdecimal,我有一个小问题,我真的很想了解。我使用assert_equal来比较两个应该相同的大十进制数。它们实际上只是一小部分,如下所示: -#<BigDecimal:7f4b40e8de78,'0.4021666666 6666666666 666666667E2',36(45)> +#<BigDecimal:7f4b40e85db8,'0.4021666666 6666666666 6666668E2',36(63)> irb(main):041:0* amount1 = B

我有一个小问题,我真的很想了解。我使用
assert_equal
来比较两个应该相同的大十进制数。它们实际上只是一小部分,如下所示:

-#<BigDecimal:7f4b40e8de78,'0.4021666666 6666666666 666666667E2',36(45)>
+#<BigDecimal:7f4b40e85db8,'0.4021666666 6666666666 6666668E2',36(63)>
irb(main):041:0* amount1 = BigDecimal("241.3")
=> #<BigDecimal:7f49bcb03558,'0.2413E3',18(18)>
irb(main):042:0> amount2 = BigDecimal("1800")
=> #<BigDecimal:7f49bcaf3400,'0.18E4',9(18)>
irb(main):043:0> rate = amount1 / amount2
=> #<BigDecimal:7f49bcae8398,'0.1340555555 5555555555 5555556E0',27(45)>
irb(main):044:0> rate * amount2 #should return amount1 = 241.3, but it does not :-(
=> #<BigDecimal:7f49bcad6a30,'0.2413000000 0000000000 00000008E3',36(45)>
irb(main):045:0> 
模型的
division\u函数
的作用完全相同。它将值为
241.3
的大十进制数除以数组的长度,即
6

在精度上似乎有很小的差别。 我想知道这可能来自哪里? 有什么方法可以更精确地控制精度吗

编辑 我用的是Mongoid。值得注意的是,Mongoid提供BigDecimal作为字段类型,但它存储为字符串。然而,我认为这不是问题所在。我相信这是红宝石的东西

编辑 我通过一个示例进一步说明了这是一个Ruby问题,与Rails没有直接关系。请参阅下文:

-#<BigDecimal:7f4b40e8de78,'0.4021666666 6666666666 666666667E2',36(45)>
+#<BigDecimal:7f4b40e85db8,'0.4021666666 6666666666 6666668E2',36(63)>
irb(main):041:0* amount1 = BigDecimal("241.3")
=> #<BigDecimal:7f49bcb03558,'0.2413E3',18(18)>
irb(main):042:0> amount2 = BigDecimal("1800")
=> #<BigDecimal:7f49bcaf3400,'0.18E4',9(18)>
irb(main):043:0> rate = amount1 / amount2
=> #<BigDecimal:7f49bcae8398,'0.1340555555 5555555555 5555556E0',27(45)>
irb(main):044:0> rate * amount2 #should return amount1 = 241.3, but it does not :-(
=> #<BigDecimal:7f49bcad6a30,'0.2413000000 0000000000 00000008E3',36(45)>
irb(main):045:0> 
irb(main):041:0*amount1=BigDecimal(“241.3”)
=> #
irb(主):042:0>amount2=BigDecimal(“1800”)
=> #
irb(主):043:0>速率=数量1/数量2
=> #
irb(main):044:0>rate*amount2应返回amount1=241.3,但它不:-(
=> #
irb(主要):045:0>
我向Ruby核心团队报告了错误。但是,这并不是您在拒绝响应中看到的错误

,虽然提供了任意精度,但不能精确地表示1/3这样的数字。因此,在某些算术过程中,您可能会遇到不精确的情况


你可以在Ruby中使用精确的数字。如果你想保持结果精确,在做算术时要小心。

你可以使用类中的方法来做数学运算。正如我在帖子中提到的,除法函数只是简单地对两个属性进行除法,方法与
assert_equal
方法调用中的第一个参数相同。一个字段是BigDecimal,另一个是数组的整数大小。我将尝试给出一个简单的示例。@CarySwoveland:谢谢你的提示。我不知道。很高兴知道。但是我依赖BigDecimal,因为Rational不幸地是Rails框架中不受支持的数据类型。因此在这种情况下,我不能使用它艾尔,我投票结束这个问题,因为它不是一个bug,答案也无助于解决问题。