正如在其他答案中所说,浮点数是不精确的。还请记住,Visualworks Float 默认为单精度(约 7 个小数位),如果您使用字母 d 对浮点数进行后缀,例如 5.1d,您将获得双精度(约 15 个小数位),不那么不精确,但仍然不精确。
另一个令人困惑的来源是两个不同的浮点数可以在 Visualworks 中以相同的近似十进制表示形式打印。
5.1 squared printString
-> '26.01'
但
5.1 squared = 26.01
-> false
请注意,最近的 Squeak 或 Pharo 打印的小数刚好足以区分不同的 Float(并重新解释它们不变)
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