正如在其他答案中所说,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