Как сказано в других ответах, Float неточны. Также помните, что 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
person
aka.nice
schedule
17.07.2012