精确的Ruby数学运算问题

时间:2010-09-23 09:46:21

标签: ruby math rounding precision

您是否知道如何使用数学精确度解决以下问题?

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

3 个答案:

答案 0 :(得分:5)

大十进制


正如man所说;

  

将无限多个实数压缩成有限数量的位需要近似表示。


然而,我使用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


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

答案 1 :(得分:2)

所有计算机语言都是如此,而不仅仅是Ruby。它是在二进制计算机上表示浮点数的一个功能:

What Every Computer Scientist Should Know About Floating Point Arithmetic

答案 2 :(得分:1)

0.1写入浮点将始终导致舍入错误。如果您想要“精确”的十进制表示,则应使用Decimal type