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

Enc*_*ira 5 ruby floating-point rspec

以下测试中的第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
Run Code Online (Sandbox Code Playgroud)

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

Dav*_*sky 12

截至rspec-2.1

specify { (0.6*2).should be_within(0.01).of(1.2) }
Run Code Online (Sandbox Code Playgroud)

在那之前:

specify { (0.6*2).should be_close(1.2, 0.01) }
Run Code Online (Sandbox Code Playgroud)


Dig*_*oss 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中重复.