Как сказано в других ответах, Float неточны. Также помните, что в Visualworks Float по умолчанию используется одинарная точность (около 7 десятичных знаков), если вы добавите число с плавающей запятой к букве d, например, 5.1d, вы получите двойную точность (около 15 десятичных знаков), менее неточную, но все же неточную. 1001 *
Еще одним источником путаницы является то, что два разных Float могут печатать с одинаковым приблизительным десятичным представлением в Visualworks.
5.1 squared printString
-> '26.01'
но
5.1 squared = 26.01
-> false
Обратите внимание, что последние Squeak или Pharo печатают достаточно десятичных знаков, чтобы различать различные значения с плавающей точкой (и интерпретировать их без изменений)
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