无法理解减法结果

时间:2014-06-14 08:12:43

标签: ruby aptana

我在Ruby(Aptana IDE)中执行了以下行

puts 3.3 - 2.7 == 0.6    #which should be true

我得到了结果

false

然后我执行了

puts 3.3 - 2.7

并将结果作为

0.5999999999999996

有人可以解释一下有什么事吗?为什么我得到0.5999999999999996而不是0.6?

3 个答案:

答案 0 :(得分:4)

浮点数不能精确地表示所有实数,并且浮点运算不能精确地表示真正的算术运算,这会导致许多令人惊讶的情况。

我建议阅读:https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

在Ruby中处理此问题的正确方法是使用BigDecimal

> require 'bigdecimal'
true

> a = BigDecimal.new('3.3')
3.3

> b = BigDecimal.new('2.7')
2.7

> c = BigDecimal.new('0.6')
0.6

> a - b == c
true

答案 1 :(得分:0)

这是浮点数学。计算机无法准确表示某些值。您可以使用Ruby的String格式来获取字符串版本:

'%0.1f' % (3.3 - 2.7) # => "0.6"

或者调整数学运算,将您的值乘以您想要的精度,然后删除该偏移量:

(3.3 * 10 - 2.7 * 10) / 10 # => 0.6

答案 2 :(得分:0)

你应该问自己(或解释者)的问题是

在我的机器中0.6与0.5999999999999996有什么不同?

答案是它并没有什么不同。您的机器中浮点数为0.5999999999999996 0.6,因为解释器用于浮点数的精度无法区分这两者。

如果此表示形式导致问题,您可以使用显式舍入Float#round

(3.3 - 2.7).round(1)
#=> 0.6

或特殊格式(检查Kernel#sprintf以获得更多选项)

"%0.1f" % (3.3 - 2.7)
#=> "0.6"