[Pharo-project] SIXX problem for ScaledDecimal
dario.trussardi at tiscali.it
Mon May 23 18:51:02 CEST 2011
> No, no, no.
> Don't use Float.
> Float are INEXACT
> (( 0.33333 asScaledDecimal: 5 )+ (0.33333 asScaledDecimal: 5 ) ) *6 = 3.99996s5
> -> FALSE !
> I don't know what ScaledDecimal expectations are or should be.
> By now, you are in charge or performing the rounding operation by yourself
> ( (1/3) asScaledDecimal: 2) roundTo: 0.01s2.
> We may add more convenient #roundToPrecision, and #roundToPrecision:
> But you could also truncate, fllor or ceil...
> On Fri, May 20, 2011 at 7:57 AM, Ralph Boland <rpboland at gmail.com> wrote:
>> Dealing with ScaledDecimal is a complicated matter and I have probably failed
>> to appreciate many of the complications but whoever is implementing
>> (and Smalltalk needs ScaledDecimal) needs to appreciate those complications.
>> Anybody here a financial expert?
> I am not a financial expert, but this is how ScaledDecimal works, in
> both Squeak/Pharo and I believe other implementations, too.
> I did run into this previously and it bugged me enough that I created
> FixedDecimal (at http://www.squeaksource.com/FixedDecimal.html ). It
> does not keep an internal more precise number - it keeps exactly what
> it shows you. (Although the implementation is somewhat odd - it does
> do what it is supposed to do.)
After Your considerations i do this conclusion for manage ScaledDecimal instance with SIXX.
1) the instance reference into the SIXX declaration is based on the ScaledDecimal notation : 1234.333s3
'<sixx.object sixx.id="0" sixx.type="ScaledDecimal" >1234.333s3</sixx.object>
2) All the translation is based on it.
Other think is the internal ScaledDecimal represent.
It's important to rounding the data so that the numerator and denominator are integer.
I do it wtih method :
| rnd |
rnd:= ScaledDecimal new
denominator: (10 raisedTo: scalePrecision)
^self roundTo: rnd
The round is automatic when i create ScaledDecimal instance with: fromString: aString
For example when converter a input string to ScaledDecimal instance based on number of digit typed.
It's required when i do conversion from another Number type:
( 1/3 asScaledDecimal: 3 ) roundToPrecision
It's all for now.
Any pointers would be greatly appreciated !
More information about the Pharo-project