From b29c0fe21d41b26c2829c7b922bf36d59e15edc3 Mon Sep 17 00:00:00 2001 From: Linas Vepstas Date: Sun, 27 Jun 2004 17:56:02 +0000 Subject: [PATCH] Audit use of gnc_numeric rounding and denom specification. Change GNC_RND to GNC_HOW_RND git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@10113 57a11ea4-9604-0410-9ed3-97b8803252fd --- src/engine/Account.c | 4 ++-- src/engine/Scrub.c | 4 ++-- src/engine/Scrub3.c | 4 +++- src/engine/Transaction.c | 44 ++++++++++++++++++------------------- src/engine/engine-helpers.c | 3 ++- src/engine/qofquerycore.c | 4 +++- 6 files changed, 34 insertions(+), 29 deletions(-) diff --git a/src/engine/Account.c b/src/engine/Account.c index 7482b963dd..959b458a7f 100644 --- a/src/engine/Account.c +++ b/src/engine/Account.c @@ -895,7 +895,7 @@ xaccAccountInsertSplit (Account *acc, Split *split) * denominator AKA 'SCU Smallest Currency Unit'. */ /* xaccSplitSetAmount(split, old_amt); */ split->amount = gnc_numeric_convert (old_amt, - xaccAccountGetCommoditySCU(acc), GNC_RND_ROUND); + xaccAccountGetCommoditySCU(acc), GNC_HOW_RND_ROUND); xaccTransCommitEdit(trans); xaccAccountCommitEdit(acc); LEAVE ("(acc=%p, split=%p)", acc, split); @@ -1818,7 +1818,7 @@ xaccAccountBalanceHelper (Account *account, gpointer data) balance = xaccAccountGetXxxBalanceInCurrency (account, cb->fn, cb->currency); cb->balance = gnc_numeric_add (cb->balance, balance, gnc_commodity_get_fraction (cb->currency), - GNC_RND_ROUND); + GNC_HOW_RND_ROUND); return NULL; } diff --git a/src/engine/Scrub.c b/src/engine/Scrub.c index ba582c4435..0815da426d 100644 --- a/src/engine/Scrub.c +++ b/src/engine/Scrub.c @@ -250,7 +250,7 @@ xaccSplitScrub (Split *split) value = xaccSplitGetValue (split); if (gnc_numeric_same (xaccSplitGetAmount (split), - value, scu, GNC_RND_ROUND)) + value, scu, GNC_HOW_RND_ROUND)) { return; } @@ -398,7 +398,7 @@ xaccTransScrubImbalance (Transaction *trans, AccountGroup *root, * of the denominators might already be reduced. */ new_value = gnc_numeric_sub (old_value, imbalance, gnc_commodity_get_fraction(currency), - GNC_RND_ROUND); + GNC_HOW_RND_ROUND); xaccSplitSetValue (balance_split, new_value); diff --git a/src/engine/Scrub3.c b/src/engine/Scrub3.c index 265b61644f..a32c305557 100644 --- a/src/engine/Scrub3.c +++ b/src/engine/Scrub3.c @@ -94,7 +94,7 @@ xaccScrubLot (GNCLot *lot) GNCPolicy *pcy; if (!lot) return FALSE; - ENTER (" "); + ENTER ("(lot=%p)", lot); acc = gnc_lot_get_account (lot); pcy = acc->policy; @@ -103,6 +103,7 @@ xaccScrubLot (GNCLot *lot) /* If the lot balance is zero, we don't need to rebalance */ lot_baln = gnc_lot_get_balance (lot); + PINFO ("lot baln=%s", gnc_numeric_to_string (lot_baln)); if (! gnc_numeric_zero_p (lot_baln)) { SplitList *node; @@ -110,6 +111,7 @@ xaccScrubLot (GNCLot *lot) /* Get the opening balance for this lot */ pcy->PolicyGetLotOpening (pcy, lot, &opening_baln, NULL, NULL); + PINFO ("lot opner baln=%s", gnc_numeric_to_string (opening_baln)); /* If the lot is fat, give the boot to all the non-opening * splits, and refill it */ diff --git a/src/engine/Transaction.c b/src/engine/Transaction.c index dc1ad04daa..72fafe8704 100644 --- a/src/engine/Transaction.c +++ b/src/engine/Transaction.c @@ -674,9 +674,9 @@ DxaccSplitSetSharePriceAndAmount (Split *s, double price, double amt) check_open (s->parent); s->amount = double_to_gnc_numeric(amt, get_commodity_denom(s), - GNC_RND_ROUND); + GNC_HOW_RND_ROUND); s->value = double_to_gnc_numeric(price * amt, get_currency_denom(s), - GNC_RND_ROUND); + GNC_HOW_RND_ROUND); SET_GAINS_A_VDIRTY(s); mark_split (s); @@ -691,9 +691,9 @@ xaccSplitSetSharePriceAndAmount (Split *s, gnc_numeric price, ENTER (" "); check_open (s->parent); - s->amount = gnc_numeric_convert(amt, get_commodity_denom(s), GNC_RND_ROUND); + s->amount = gnc_numeric_convert(amt, get_commodity_denom(s), GNC_HOW_RND_ROUND); s->value = gnc_numeric_mul(s->amount, price, - get_currency_denom(s), GNC_RND_ROUND); + get_currency_denom(s), GNC_HOW_RND_ROUND); SET_GAINS_A_VDIRTY(s); mark_split (s); @@ -709,7 +709,7 @@ xaccSplitSetSharePrice (Split *s, gnc_numeric price) s->value = gnc_numeric_mul(xaccSplitGetAmount(s), price, get_currency_denom(s), - GNC_RND_ROUND); + GNC_HOW_RND_ROUND); SET_GAINS_VDIRTY(s); mark_split (s); @@ -722,7 +722,7 @@ DxaccSplitSetShareAmount (Split *s, double damt) gnc_numeric old_price, old_amt; int commodity_denom = get_commodity_denom(s); gnc_numeric amt = double_to_gnc_numeric(damt, commodity_denom, - GNC_RND_ROUND); + GNC_HOW_RND_ROUND); if (!s) return; ENTER (" "); check_open (s->parent); @@ -732,16 +732,16 @@ DxaccSplitSetShareAmount (Split *s, double damt) { old_price = gnc_numeric_div(xaccSplitGetValue (s), old_amt, GNC_DENOM_AUTO, - GNC_DENOM_REDUCE); + GNC_HOW_DENOM_REDUCE); } else { old_price = gnc_numeric_create(1, 1); } s->amount = gnc_numeric_convert(amt, commodity_denom, - GNC_RND_NEVER); + GNC_HOW_RND_NEVER); s->value = gnc_numeric_mul(s->amount, old_price, - get_currency_denom(s), GNC_RND_ROUND); + get_currency_denom(s), GNC_HOW_RND_ROUND); SET_GAINS_A_VDIRTY(s); mark_split (s); @@ -757,7 +757,7 @@ xaccSplitSetAmount (Split *s, gnc_numeric amt) s->amount.num, s->amount.denom, amt.num, amt.denom); check_open (s->parent); - s->amount = gnc_numeric_convert(amt, get_commodity_denom(s), GNC_RND_ROUND); + s->amount = gnc_numeric_convert(amt, get_commodity_denom(s), GNC_HOW_RND_ROUND); SET_GAINS_ADIRTY(s); mark_split (s); @@ -773,7 +773,7 @@ xaccSplitSetValue (Split *s, gnc_numeric amt) s->value.num, s->value.denom, amt.num, amt.denom); check_open (s->parent); - s->value = gnc_numeric_convert(amt, get_currency_denom(s), GNC_RND_ROUND); + s->value = gnc_numeric_convert(amt, get_currency_denom(s), GNC_HOW_RND_ROUND); SET_GAINS_VDIRTY(s); mark_split (s); @@ -1250,15 +1250,15 @@ xaccSplitSetBaseValue (Split *s, gnc_numeric value, if(gnc_commodity_equiv(commodity, base_currency)) { s->amount = gnc_numeric_convert(value, get_commodity_denom(s), - GNC_RND_NEVER); + GNC_HOW_RND_NEVER); } s->value = gnc_numeric_convert(value, get_currency_denom(s), - GNC_RND_NEVER); + GNC_HOW_RND_NEVER); } else if (gnc_commodity_equiv(commodity, base_currency)) { s->amount = gnc_numeric_convert(value, get_commodity_denom(s), - GNC_RND_NEVER); + GNC_HOW_RND_NEVER); } else { PERR ("inappropriate base currency %s " @@ -1356,12 +1356,12 @@ xaccSplitsComputeValue (GList *splits, Split * skip_me, if (gnc_commodity_equiv(currency, base_currency)) { value = gnc_numeric_add(value, xaccSplitGetValue(s), - GNC_DENOM_AUTO, GNC_DENOM_LCD); + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); } else if (gnc_commodity_equiv(commodity, base_currency)) { value = gnc_numeric_add(value, xaccSplitGetAmount(s), - GNC_DENOM_AUTO, GNC_DENOM_LCD); + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); } else { PERR ("inconsistent currencies\n" @@ -1377,7 +1377,7 @@ xaccSplitsComputeValue (GList *splits, Split * skip_me, * doesn't mean the denominators are the same! */ value = gnc_numeric_convert (value, gnc_commodity_get_fraction (base_currency), - GNC_RND_ROUND); + GNC_HOW_RND_ROUND); LEAVE (" total=%lld/%lld", value.num, value.denom); return value; @@ -1409,7 +1409,7 @@ xaccTransGetAccountValue (const Transaction *trans, Account *a = xaccSplitGetAccount (s); if (a == account) total = gnc_numeric_add (total, xaccSplitGetValue (s), - GNC_DENOM_AUTO, GNC_DENOM_LCD); + GNC_DENOM_AUTO, GNC_HOW_DENOM_LCD); } return total; } @@ -1446,7 +1446,7 @@ xaccTransSetCurrency (Transaction *trans, gnc_commodity *curr) { Split *s = splits->data; s->value = gnc_numeric_convert(xaccSplitGetValue(s), - fraction, GNC_RND_ROUND); + fraction, GNC_HOW_RND_ROUND); SET_GAINS_VDIRTY(s); } } @@ -2006,7 +2006,7 @@ xaccTransAppendSplit (Transaction *trans, Split *split) gnc_numeric new_value; new_value = gnc_numeric_convert(xaccSplitGetValue(split), - fraction, GNC_RND_ROUND); + fraction, GNC_HOW_RND_ROUND); if (gnc_numeric_check (new_value) == GNC_ERROR_OK) split->value = new_value; SET_GAINS_VDIRTY(split); @@ -2842,8 +2842,8 @@ xaccSplitGetSharePrice (const Split * split) } return gnc_numeric_div(val, amt, GNC_DENOM_AUTO, - GNC_DENOM_SIGFIGS(PRICE_SIGFIGS) | - GNC_RND_ROUND); + GNC_HOW_DENOM_SIGFIGS(PRICE_SIGFIGS) | + GNC_HOW_RND_ROUND); } /********************************************************************\ diff --git a/src/engine/engine-helpers.c b/src/engine/engine-helpers.c index 98ddf93fcf..b7168a8d43 100644 --- a/src/engine/engine-helpers.c +++ b/src/engine/engine-helpers.c @@ -1285,7 +1285,8 @@ gnc_scm2query_term_query_v1 (SCM query_term_scm) query_term_scm = SCM_CDR (query_term_scm); amount = scm_num2dbl (scm, __FUNCTION__); - val = double_to_gnc_numeric (amount, GNC_DENOM_AUTO, GNC_RND_ROUND); + val = double_to_gnc_numeric (amount, GNC_DENOM_AUTO, + GNC_HOW_DENOM_SIGFIGS(6) | GNC_HOW_RND_ROUND); if (!safe_strcmp (pr_type, "pr-price")) { xaccQueryAddSharePriceMatch (q, val, how, QOF_QUERY_OR); diff --git a/src/engine/qofquerycore.c b/src/engine/qofquerycore.c index 99b4b631db..e5fe4aa9ec 100644 --- a/src/engine/qofquerycore.c +++ b/src/engine/qofquerycore.c @@ -404,13 +404,15 @@ numeric_match_predicate (gpointer object, QofParam *getter, break; } + /* Amounts are considered to be 'equal' if they match to + * four decimal places. (epsilon=1/10000) */ if (pd->how == QOF_COMPARE_EQUAL || pd->how == QOF_COMPARE_NEQ) { gnc_numeric cmp_val = gnc_numeric_create (1, 10000); compare = (gnc_numeric_compare (gnc_numeric_abs (gnc_numeric_sub (gnc_numeric_abs (obj_val), gnc_numeric_abs (pdata->amount), - 100000, GNC_RND_ROUND)), + 100000, GNC_HOW_RND_ROUND)), cmp_val) < 0); } else compare = gnc_numeric_compare (gnc_numeric_abs (obj_val), pdata->amount);