以下测试中的第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问题?
答案 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中重复。