Re: [Pharo-project] SIXX problem for ScaledDecimal

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

Re: [Pharo-project] SIXX problem for ScaledDecimal

dario trussardi

Il giorno 20/mag/2011, alle ore 16.57, Ralph Boland ha scritto:

>> From: Chris Cunningham <[hidden email]>
>> Subject: Re: [Pharo-project] SIXX problem for ScaledDecimal
>> To: [hidden email]
>> Message-ID: <BANLkTinP7E_oh2Fi2=[hidden email]>
>> Content-Type: text/plain; charset=ISO-8859-1
>
>> For ScaledDecimal, SIXX should definite store it as the underlying
>> fraction.  Storing it in the printed fashion does change the value of
>> the ScaledDecimal.
>
>> (1/3) asScaledDecimal: 2  gives  0.33s2
>> and
>> (33/100) asScaledDecimal: 2  gives  0.33s2
>> yet
>> 0.33s2 ~= ( (1/3) asScaledDecimal: 2 )
>> and
>> ( (1/3) asScaledDecimal: 2 ) ~= ( (33/100) asScaledDecimal: 2 )
>
>> In other words, the ScaledDecimal is about the precise internal number
>> and the scale to display it - which is NOT the scale that it is stored
>> as.
>
>> -Chris
>
> I don't agree.  ScaledDecimal would be used where consistency is often
> more important than accuracy, e.g. in Financial calculations where being off by
> a few pennies doesn't matter but always getting the same answer matters a LOT.
> Once a number is converted to a ScaledDecimal computations must always
> produce the same result assuming enough digits.  To ensure this asScaledDecimal
> must produce a scaled decimal for use in computations and, as such, storing
> a fraction internally is unacceptable.
> From a financial point of view  1/3  * 3  is not 1!
> From a programmers point of view asScaledDecimal changes the value
> in  much the same way asInteger does for a float.
>
> Having said all of this allow me to contradict myself.  It seems to me that
> a scaled decimal should in general store more digits than are displayed.
> For example money might be stored with a large (possibly arbitrary) number
> of digits after the decimal point but only display two digits beyond the decimal
> point.
> I don't know how ScaledDecimal is implemented but I would be inclined to
> use arbitrary or large size integers and store the location of the decimal point
> internally recomputing the position of the decimal point after each calculation.
> This is an expensive way of doing computations but I expect users of
> ScaledDecimal can live with that.  When converting non decimal results to
> ScaledDecimal then how many digits of precision to maintain must be specified
> somehow.
> Dealing with ScaledDecimal is a complicated matter and I have probably failed
> to appreciate many of the complications but whoever is implementing
> ScaledDecimal
> (and Smalltalk needs ScaledDecimal) needs to appreciate those complications.
> Anybody here a financial expert?
>
> Ralph Boland
>

I think ScaledDecimal for financial data.

Where rounded is do only for the last of the operations. ( the total of the document for example or when i command it  )

I do :

( ((1/3 asScaledDecimal:5 ) + (1/3 asScaledDecimal:5 )) * (6 asScaledDecimal:5) )


The result 4 is not right .


2/3 * 6   when  management 5 decimal are :

        0,66666 * 6,00000 =  3,99996

and not  fraction 2/3 * 6/1   -> 12 / 3 - >  4


I'm surprised about it.

Any idea ?

Dario

Reply | Threaded
Open this post in threaded view
|

Re: [Pharo-project] SIXX problem for ScaledDecimal

dario trussardi

But:

>
> Il giorno 20/mag/2011, alle ore 16.57, Ralph Boland ha scritto:
>
>>> From: Chris Cunningham <[hidden email]>
>>> Subject: Re: [Pharo-project] SIXX problem for ScaledDecimal
>>> To: [hidden email]
>>> Message-ID: <BANLkTinP7E_oh2Fi2=[hidden email]>
>>> Content-Type: text/plain; charset=ISO-8859-1
>>
>>> For ScaledDecimal, SIXX should definite store it as the underlying
>>> fraction.  Storing it in the printed fashion does change the value of
>>> the ScaledDecimal.
>>
>>> (1/3) asScaledDecimal: 2  gives  0.33s2
>>> and
>>> (33/100) asScaledDecimal: 2  gives  0.33s2
>>> yet
>>> 0.33s2 ~= ( (1/3) asScaledDecimal: 2 )
>>> and
>>> ( (1/3) asScaledDecimal: 2 ) ~= ( (33/100) asScaledDecimal: 2 )
>>
>>> In other words, the ScaledDecimal is about the precise internal number
>>> and the scale to display it - which is NOT the scale that it is stored
>>> as.
>>
>>> -Chris
>>
>> I don't agree.  ScaledDecimal would be used where consistency is often
>> more important than accuracy, e.g. in Financial calculations where being off by
>> a few pennies doesn't matter but always getting the same answer matters a LOT.
>> Once a number is converted to a ScaledDecimal computations must always
>> produce the same result assuming enough digits.  To ensure this asScaledDecimal
>> must produce a scaled decimal for use in computations and, as such, storing
>> a fraction internally is unacceptable.
>> From a financial point of view  1/3  * 3  is not 1!
>> From a programmers point of view asScaledDecimal changes the value
>> in  much the same way asInteger does for a float.
>>
>> Having said all of this allow me to contradict myself.  It seems to me that
>> a scaled decimal should in general store more digits than are displayed.
>> For example money might be stored with a large (possibly arbitrary) number
>> of digits after the decimal point but only display two digits beyond the decimal
>> point.
>> I don't know how ScaledDecimal is implemented but I would be inclined to
>> use arbitrary or large size integers and store the location of the decimal point
>> internally recomputing the position of the decimal point after each calculation.
>> This is an expensive way of doing computations but I expect users of
>> ScaledDecimal can live with that.  When converting non decimal results to
>> ScaledDecimal then how many digits of precision to maintain must be specified
>> somehow.
>> Dealing with ScaledDecimal is a complicated matter and I have probably failed
>> to appreciate many of the complications but whoever is implementing
>> ScaledDecimal
>> (and Smalltalk needs ScaledDecimal) needs to appreciate those complications.
>> Anybody here a financial expert?
>>
>> Ralph Boland
>>
>
> I think ScaledDecimal for financial data.
>
> Where rounded is do only for the last of the operations. ( the total of the document for example or when i command it  )
>
> I do :
>
> ( ((1/3 asScaledDecimal:5 ) + (1/3 asScaledDecimal:5 )) * (6 asScaledDecimal:5) )
>
>
> The result 4 is not right .
>
>
> 2/3 * 6   when  management 5 decimal are :
>
> 0,66666 * 6,00000 =  3,99996
>
> and not  fraction 2/3 * 6/1   -> 12 / 3 - >  4
>

(( 0.33333 asScaledDecimal: 5 )+  (0.33333 asScaledDecimal: 5 ) ) *6  3.99996s5


is right.

        Dario