Come detto in altre risposte, Float non sono esatti. Ricorda inoltre che Visualworks Float ha l'impostazione predefinita di precisione singola (circa 7 posizioni decimali), se hai posfix il tuo numero float con la lettera d, come 5.1d otterrai una precisione doppia (circa 15 posizioni decimali), meno inesatta, ma ancora inesatta.
Un'ulteriore fonte di confusione è che due Float diversi possono stampare con la stessa rappresentazione approssimativa decimale in Visualworks.
5.1 squared printString
-> '26.01'
ma
5.1 squared = 26.01
-> false
Nota che la recente Squeak o stampe Pharo appena sufficiente decimali di distinguere Float diverso (e li reinterpretano invariato)
5.1 squared
->26.009999999999998
In alternativa, è possibile utilizzare il cosiddetto FixedPoint (in VisualWorks o ScaledDecimals in altri formati) per eseguire operazioni esatte:
Attenzione anche a questa altra trappola: un Punto Fisso (ScaledDecimals) stampa solo tanti decimali dopo il punto di frazione come gli è stato detto, ma internamente può contenere più (infinitamente molti).
5.1s1 squared printString
-> '26.0s1'
ma
5.1s1 squared = 26.01s2
-> true
fonte
2012-07-17 21:50:49