Interesting, however current version FixedDecimals.cbc.12.mcz is bugged.
example:
(-53/10 asFixedDecimal: 2) fractionPart.
Some suggestions: - why maintaining so many forms in parallel ? Not bug-proof, you happen to update one form not the other... sign is not handled in part1 nor part2 - negated should create a new instance rather than modifying the number in place - FixedDecimals does not implement hash, therefore cannot be stored in a Dictionary. Particularly, cannot be stored in a workspace variable. I suggest hash ^self asFraction hash - likewise, implement all subclassResponsibility ( 5/3) * (5/3 asFixedDecimal: 2). ( 2.0s1) * (5/3 asFixedDecimal: 2). (5/3 asFixedDecimal: 2) reciprocal. - coercion depends on receiver: | a b | a := (53/10 asFixedDecimal: 2). b := 5.3. { (a+b) class. (b+a) class. } "is {FixedDecimal . Float}" - maybe add another rounding mode in arithmetic (to nearest even...) - create a specific notation for transparent read/write, like 5.30f (requires some easy support in Number class>>readFrom: or NumberParser)
From algebraic point of view, the main concern is that some numbers might not have any reciprocal... Unless the reciprocal is a Fraction, and arithmetic op coerce to Fraction... But, eh, this is just the case of Float: | f | f := (8872240531573379/9007199254740992) asFloat. f * f reciprocal - 1
Cheers
Nicolas
Chris Cunningham a écrit :
Hi.
I've just release a package FixedDecimal on SqueakSource.
A FixedDecimal is similar to a ScaledDecimal, but different in certain select ways. It's primary purpose was to be able to represent precise decimals for such things as representing money - where ScaledDecimals leave something to be desired. For instance, with ScaledDecimals, you get: (33.333s withScale:2) + (33.333s withScale:2) print it yields 66.67s but with FixedDecimals, you would get: (33.333 asFixedDecimal: 2) + (33.333 asFixedDecimal: 2) print it yields 66.66. So, FixedDecimals round the numbers to the exact scale you specify - converting a float to a FixedDecimal and back will not necessarily return the starting number, unlike ScaledDecimals.
Most simple arithmetic is defined for FixedDecimals, but not all methods that probably should be (it's getting late and I'm going away for the weekend - thought I'd publish what I have).
Thanks, Chris