Hi Denis, If you decompose the operation performed by round: (146.015 / 0.01) rounded * 0.01
'146.015' asFloat is inexact '0.01' asFloat is inexact / 0.01 operation is inexact '0.01' asFloat is inexact (again) * 0.01 operation is inexact That means cumulating 5 inexact operations, how do you say "jouer à la roulette russe"? Pharo guys did propose a better scheme (146.015 * 100.0) rounded / 100.0 Since '100.0' asFloat is exact, that leave only 2 inexact operations and works much better (and we know the last one rounds exactly). But if (146.015 asFraction < 146.015s3) then you still have a problem with inexactness of original value. I see two solutions for this root problem: - don't use Float, but Fraction or ScaledDecimals - use a trick, asMinimalDecimalFraction which I proposed in http://code.google.com/p/pharo/issues/detail?id=4957 that will convert ('146.015' asFloat) to the exact fraction that is printed 146015/1000... (x asMinimalDecimalFraction roundTo: 1/100) asFloat would thus be close to your requirements... Nicolas 2012/9/7 Denis Kudriashov <[email protected]>: > Hello. > > I know there are many similar questions. > > Maybe somebody give me fast answer. > > 146.015 roundTo: 0.01 => 146.01 > > I guess internal representation of 146.015 is something like > 146.014999999999... > That's why rounding result is 146.01 > > But how I can round arbitrary float my math root? > How to fix my example to get 146.02? > > Best regards, > Denis
