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)
正如那人说的那样;
将无限多个实数压缩成有限数量的比特需要近似表示.
然而,我使用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)
如您所见,确保可靠的精度是可能的,但需要一点点努力.