5.3 printShowingDecimalPlaces: 2 displays '5.29' instead of'5.30'

nicolas cellier ncellier at ifrance.com
Thu Nov 22 20:35:39 UTC 2007


Tome is right. Don't use a Float

In Smalltalk, use 5.30s2.

5.3 machine representation is not 53/10 though it looks like, and though 
major Smalltalk dialects will answer true to 53/10=5.3 (i think they 
should not - see http://bugs.squeak.org/view.php?id=3374 and 
http://www.lispworks.com/documentation/lcl50/aug/aug-170.html).

You can check it with 5.3 asTrueFraction, that is 
(2r10101001100110011001100110011001100110011001100110011/2r100000000000000000000000000000000000000000000000000).

And if it prints 5.29s2, then it is because of 
http://bugs.squeak.org/view.php?id=5693 that you did not care to read.

* 5.3 asTrueFraction < (53/10)
* ScaledDecimal use truncated print,
=> you have the explanation.

The only thing you should try if you cannot get read of Float because of 
3rd party code is:

(5.3 asScaledDecimal: 2) roundTo: 0.01s2.

Nicolas

Tom Phoenix a écrit :
> On 11/22/07, Sebastian Sastre <ssastre at seaswork.com> wrote:
> 
>> Let's supose the user enters in some
>> input widget with keyboard the '5.30' value. That will end as a Float at
>> some point.
> 
> Why will it?
> 
> We're talking about monetary units. If you start with a string like
> '5.30', meaning 530 monetary units, it won't "end as a Float" all by
> itself. If somebody somewhere wrote code that converted it to floating
> point, that's a bug.
> 
> Don't be misled by what looks like a decimal point. If you're working
> with money, you don't want floating point, no matter what your
> programming language. Floating point will lose tiny bits due to
> roundoff; but money numbers are almost always integral numbers of
> cents, and you don't want to lose any of them. Floating point may be
> needed to perform some calculations along the way, but you'll use
> integers to get the books to balance.
> 
> ObSqueak: 5.30 asFraction
> 
> Cheers!
> 
> --Tom Phoenix
> 
> 




More information about the Squeak-dev mailing list