比较rspec中的浮点数时的奇怪行为

时间:2011-06-05 16:36:51

标签: ruby rspec floating-point

以下测试中的第3次失败:

  specify { (0.6*2).should eql(1.2) }
  specify { (0.3*3).should eql(0.3*3) }
  specify { (0.3*3).should eql(0.9) } # this one fails

为什么?这是浮点问题还是ruby或rspec问题?

2 个答案:

答案 0 :(得分:12)

从rspec-2.1开始

specify { (0.6*2).should be_within(0.01).of(1.2) }

在此之前:

specify { (0.6*2).should be_close(1.2, 0.01) }

答案 1 :(得分:8)

不要比较浮点数的相等性

问题是0.3和0.9都没有浮点格式的精确表示 1 ,因此当乘以0.3 * 3时,你会得到一个非常非常接近0.9的数字,并且这将打印为0.9,但不是0.9。

你的0.9常数也不是0.9,两个数字略有不同。

对浮点数使用精确的相等比较通常是任何语言的错误。


1。所有大约 2 52 的整数都具有精确的FP表示,但这些分数由 1/2 n <的序列组成/ strong>条款。 大多数十进制字符串分数在基数2中重复。