Rounding in the price db.

Geert Janssens geert.gnucash at kobaltwit.be
Mon Aug 10 05:34:50 EDT 2015


On Sunday 09 August 2015 19:29:51 Mike Alexander wrote:
> --On August 9, 2015 at 8:35:04 PM +0100 John Ralls
> <jralls at ceridwen.us>
> wrote:
> > A recent IRC conversation and a discussion (face to face!) with a
> > user got me thinking about the prices entered from the transfer
> > dialog into the price db. The current situation is that when the
> > user
> > creates a transaction between accounts with differing currencies and
> > commodities, the transfer dialog comes up to get either a price or
> > the value in the “other” currency. The user duly enters a number
> > and GC does the appropriate calculation, rounding the value to the
> > max denominator for the “other” account’s currency/commodity,
> > then recalculating the “true” price without the rounding and
> > saves the result in the price db. The user could do several entries
> > with the same nominal exchange rate and get a different exact
> > fraction for each because of the rounding of the value.
> > 
> > Does that really make sense? Should we round the price we store in
> > the price db to some reasonable fraction? What fraction? The
> > smallest
> > commodity unit (scu) of the “value” currency/commodity seems
> > reasonable to me. For example, if the entry is of  how many US
> > Dollars buys a Euro or a share of Ford stock, the price should be
> > rounded to the scu of US Dollars, i.e. cents. OTOH some mutual funds
> > price in mils ($.0001), so perhaps we should round the price db
> > entries to
> 
> No, that doesn't make sense.  I've been bothered by this for some
> time.
> 
> However, I don't think rounding to the SCU of either commodity is
> correct.  Suppose the SCU of A and B is 2 and the official exchange
> rate from A to B is 1.500555 (my bank quotes rates to 6 decimal places
> when I buy foreign currency).  If I first convert 2.00 A to 3.00 B by
> entering this exchange rate in the transfer dialog it would record an
> exchange rate of 1.50.  Later a value of 2000 A would be converted by
> default to 3000 B, not 3001.11.  I think you need to record more
> digits than the SCU.  Ideally you should record exactly what is
> entered in the transfer dialog if the user enters a price rather than
> a destination value.  If they enter a destination value then you
> probably should record at least 6 places after the decimal point.
> 
> Things get tricky if the ratio is very small.  The current rate for
> USD per Sao Tomean Dobra per USD is 0.0000444615.  if you rounded
> this to 0.000044, you lose a lot of precision.  If someone enters a
> transaction of 1000 Dobra to USD .04 (unlikely, but valid) then the
> recorded rate to 2 places would be zero which is clearly a bad idea.
> 
I seem to remember that banks here use 6 significant digits in exchange 
rates, which is not quite the same as 6 places after the decimal point. 
Your USD-Sao Tomean Dobra illustrates this: due to the extreme value 
difference between the two you need 10 digits after the decimal point, 
but only 6 of them are significant (ie not a leading zero).

Is this something our gnc_numeric code supports and can be used by the 
price db ?

Geert



More information about the gnucash-devel mailing list