您是否知道如何使用数学精确度解决以下问题?
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
答案 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。