Test rounded values, but don't store them, to minimize jitter in prices.

This commit is contained in:
John Ralls 2016-03-11 15:10:12 -08:00
parent e26e598cdc
commit c4ce44df64

View File

@ -1586,15 +1586,21 @@ update_price(XferDialog *xferData, PriceReq *pr)
gnc_commodity *to = xferData->to_commodity;
gnc_numeric value = gnc_amount_edit_get_amount(GNC_AMOUNT_EDIT(xferData->price_edit));
gnc_numeric price_value = gnc_price_get_value(pr->price);
gnc_numeric rounded_pr_value = round_price(pr->from, pr->to, price_value);
gnc_numeric rounded_value;
if (gnc_numeric_equal(pr->reverse ? gnc_numeric_invert(value) : value,
price_value))
if (gnc_price_get_source(pr->price) < xferData->price_source)
{
PINFO("Existing price is preferred, so won't supersede.");
gnc_price_unref (pr->price);
return;
}
if (pr->reverse)
value = swap_commodities(&from, &to, value);
/* Test the rounded values for equality to minimize price-dithering. */
rounded_value = round_price(from, to, value);
if (gnc_numeric_equal(rounded_value, rounded_pr_value))
{
PINFO("Same price for %s in %s",
gnc_commodity_get_mnemonic(pr->from),
@ -1605,10 +1611,7 @@ update_price(XferDialog *xferData, PriceReq *pr)
gnc_price_begin_edit (pr->price);
gnc_price_set_time (pr->price, pr->ts);
gnc_price_set_typestr(pr->price, xferData->price_type);
if (pr->reverse)
gnc_price_set_value (pr->price, gnc_numeric_invert(value));
else
gnc_price_set_value (pr->price, value);
gnc_price_set_value (pr->price, value);
gnc_price_commit_edit (pr->price);
PINFO("Updated price: 1 %s = %f %s",
gnc_commodity_get_mnemonic(pr->from),