正如在其他答案中所說,Float是不精確的。另外請記住,Visualworks Float默認爲單精度(約7位小數),如果你使用字母d來填充浮點數,就像5.1d一樣,你將得到雙精度(大約15位小數),不精確但仍不精確。
另一個混亂的原因是兩個不同的Float可以在Visualworks中使用相同的近似小數表示形式進行打印。
5.1 squared printString
-> '26.01'
但
5.1 squared = 26.01
-> false
注意,最近佳樂或菲羅打印剛夠小數來區分不同的浮動(和重新解釋不變)
5.1 squared
->26.009999999999998
或者,你可以用所謂的FixedPoint(在VisualWorks或其他風格的ScaledDecimals中)執行精確操作:
theTestArray := #(1.2s 3 5.1s 7).
self assert: theTestArray squareOfAllElements = #(1.44s 9 26.01s 49).
另外要注意這個其他陷阱:FixedPoint(ScaledDecimals)只打印分數點後的小數點,但它在內部可以容納更多(無限多)。
5.1s1 squared printString
-> '26.0s1'
但
5.1s1 squared = 26.01s2
-> true