精确的Ruby数学运算问题

And*_*rei 1 ruby math precision rounding

你知道如何解决数学精度的以下问题吗?

p RUBY_VERSION # => "1.9.1"
p 0.1%1 # => 0.1
p 1.1%1 # => 0.1
p 90.0%1 # => 0.0
p 90.1%1 # => 0.0999999999999943
p 900.1%1 # => 0.100000000000023

p RUBY_VERSION # => "1.9.2"
p 0.1%1 # => 0.1
p 1.1%1 # => 0.10000000000000009
p 90.0%1 # => 0.0
p 90.1%1 # => 0.09999999999999432
p 900.1%1 # => 0.10000000000002274
Run Code Online (Sandbox Code Playgroud)

Chr*_*ley 5

大十进制


正如那说的那样;

将无限多个实数压缩成有限数量的比特需要近似表示.


然而,我使用BigDecimal类取得了巨大成功.引用它的介绍

Ruby为任意精度整数运算提供内置支持.例如:

42**13 - > 1265437718438866624512

BigDecimal为非常大或非常准确的浮点数提供类似的支持.


以你的一个例子为例;

>> x = BigDecimal.new('900.1')
=> #<BigDecimal:101113be8,'0.9001E3',8(8)>
>> x % 1
=> #<BigDecimal:10110b498,'0.1E0',4(16)>
>> y = x % 1
=> #<BigDecimal:101104760,'0.1E0',4(16)>
>> y.to_s
=> "0.1E0"
>> y.to_f
=> 0.1
Run Code Online (Sandbox Code Playgroud)


如您所见,确保可靠的精度是可能的,但需要一点点努力.