首先,採取特定浮動f
:浮動的不一致轉換爲十進制在Ruby中
f = [64.4, 73.60, 77.90, 87.40, 95.40].sample # take any one of these special Floats
f.to_d.class == (1.to_d * f).class # => true (BigDecimal)
因此,通過BigDecimal
乘以蒙上f
到BigDecimal
。因此1.to_d * f
(或f * 1.to_d
)可以被看作是將(f
)轉換爲BigDecimal
的(差但仍然)形式。然而,對於這些具體的值,我們有:
f.to_d == 1.to_d * f # => false (?!)
這不是一個錯誤嗎?我假設,乘以1.to_d
Ruby應該在內部調用f.to_d
。但結果不同,即對於f = 64.4
:
f.to_d # => #<BigDecimal:7f8202038280,'0.644E2',18(36)>
1.to_d * f # => #<BigDecimal:7f82019c1208,'0.6440000000 000001E2',27(45)>
我不明白爲什麼浮點表示誤差應該在這裏的藉口,但它顯然是一個原因,不知何故。那麼爲什麼會這樣呢?
PS。我寫的代碼這個問題玩弄一個片段:
https://github.com/Swarzkopf314/ruby_wtf/blob/master/multiplication_by_unit.rb
'f == f.to_d'是否返回true? –
在'.to_d'之後'f'的值是多少?內部表示通常非常明顯。 – tadman
我編輯了我的問題。 –