Comme indiqué dans les autres réponses, Float sont inexacts. Souvenez-vous aussi que Visualworks Float par défaut à une seule précision (environ 7 décimales), si vous posfix votre nombre float avec la lettre d, comme 5.1d vous obtiendrez double précision (environ 15 décimales), moins inexact, mais toujours inexact.
Une autre source de confusion est que deux types de fichiers Float peuvent imprimer avec la même représentation décimale approximative dans Visualworks.
5.1 squared printString
-> '26.01'
mais
5.1 squared = 26.01
-> false
Notez que Squeak récentes ou impressions Pharo seulement décimaux assez pour distinguer les différents Float (et les réinterprètent inchangé)
5.1 squared
->26.009999999999998
Vous pouvez également utiliser le soi-disant FixedPoint (dans VisualWorks, ou ScaledDecimals dans d'autres versions) pour effectuer des opérations exactes:
theTestArray := #(1.2s 3 5.1s 7).
self assert: theTestArray squareOfAllElements = #(1.44s 9 26.01s 49).
Méfiez-vous également de cet autre piège: un FixedPoint (ScaledDecimals) imprime seulement autant de décimales après le point de fraction qu'on le lui a demandé, mais en interne il peut en contenir plus (infiniment).
5.1s1 squared printString
-> '26.0s1'
mais
5.1s1 squared = 26.01s2
-> true