When a transaction posts to two commodities without specifying the conversion price, we generate a price which makes it balance (cf http://hledger.org/manual.html#prices). Until now, these generated prices were always shown with full precision (all available decimal digits) so that a manual calculation with the displayed numbers would agree. If there's just one posting in the commodity being priced, we can use an exact total price and the precision is no problem. But if there are multiple postings in the commodity being priced, we must show the averaged unit price. This can be an irrational number, which with our current Decimal-based implementation would display an excessive 255 decimal digits. So in this case we now set the price's display precision to the sum of the (max) display precisions of the commodities involved. An example: hledgerdev -f- print <<< 1/1 c C 10.00 c C 11.00 d D -320.00 >>> 2015/01/01 c C 10.00 @ D 15.2381 c C 11.00 @ D 15.2381 d D -320.00 >>>=0 There might still be cases where this will show more price decimal places than necessary. For now, YAGNI.
163 lines
3.9 KiB
Plaintext
163 lines
3.9 KiB
Plaintext
# http://code.google.com/p/hledger/issues/detail?id=23
|
|
#
|
|
# 1. original test case, this should balance since price precisions do
|
|
# not affect the canonical display precisions used for display and balancing
|
|
hledgerdev -f - print
|
|
<<<
|
|
2010/1/1 x
|
|
A 55.3653 C @ 30.92189512 D
|
|
A -1712 D
|
|
>>>
|
|
2010/01/01 x
|
|
A 55.3653 C @ 30.92189512 D
|
|
A -1712 D
|
|
|
|
>>>=0
|
|
|
|
## 1b. here $'s canonical display precision should be 2 not 4
|
|
## XXX no, because the inferred amount $1.0049 is observed
|
|
# hledgerdev -f - print --cost
|
|
# <<<
|
|
# 2010/1/1
|
|
# a $0.00
|
|
# a 1C @ $1.0049
|
|
# a
|
|
# >>>
|
|
# 2010/01/01
|
|
# a 0
|
|
# a $1.00
|
|
# a $-1.00
|
|
#
|
|
# >>>=0
|
|
|
|
# 2. and here the price should be printed with its original precision, not
|
|
# the canonical display precision
|
|
hledgerdev -f - print
|
|
<<<
|
|
2010/1/1
|
|
a $0.00
|
|
a 1C @ $1.0049
|
|
a
|
|
>>>
|
|
2010/01/01
|
|
a 0
|
|
a 1C @ $1.0049
|
|
a $-1.0049
|
|
|
|
>>>=0
|
|
|
|
# 3. with $'s display precision at 3 or more, this txn should not balance.
|
|
# The error message shows the difference with full precision.
|
|
hledgerdev -f - balance --no-total --cost --empty
|
|
<<<
|
|
2010/1/1
|
|
a 1C @ $1.0049
|
|
a $-1.000
|
|
>>>2 /off by \$0.0049/
|
|
>>>= 1
|
|
|
|
# 4. with $'s display precision at 2 or less, this txn should balance
|
|
hledgerdev -f - balance --no-total --cost --empty
|
|
<<<
|
|
2010/1/1
|
|
a 1C @ $1.0049
|
|
a $-1.00
|
|
>>>
|
|
0 a
|
|
>>>=0
|
|
|
|
# 5. avamk's 2011/1/19 example
|
|
hledgerdev -f - balance --cost
|
|
<<<
|
|
2001/01/01 * ACME fund
|
|
assets:investment:ACME 203.890 ACME @ $16.02
|
|
equity:opening balances
|
|
>>>
|
|
$3266.32 assets:investment:ACME
|
|
$-3266.32 equity:opening balances
|
|
--------------------
|
|
0
|
|
>>>=0
|
|
|
|
# hledger 0.14pre: precision=2, presumably from price
|
|
# $3266.32 assets:investment:ACME
|
|
# $-3266.32 equity:opening balances
|
|
#--------------------
|
|
# $0.00
|
|
#
|
|
# ledger "2.6.0.90" with -s: full precision, ignores price
|
|
# $3266.3178 assets:investment:ACME
|
|
# $-3266.3178 equity:opening balances
|
|
#
|
|
# ledger 3: precision=0, uses default, ignores price
|
|
# $3266 assets:investment:ACME
|
|
# $-3266 equity:opening balances
|
|
#--------------------
|
|
# 0
|
|
|
|
## 6. with a default commodity.. XXX should observe it
|
|
hledgerdev -f - balance --cost
|
|
<<<
|
|
D $1000.0
|
|
2001/01/01 * ACME fund
|
|
assets:investment:ACME 203.890 ACME @ $16.02
|
|
equity:opening balances
|
|
>>>
|
|
$3266.32 assets:investment:ACME
|
|
$-3266.32 equity:opening balances
|
|
--------------------
|
|
0
|
|
>>>=0
|
|
### hledger 0.14pre: precision=2, presumably from price, ignores D
|
|
### $3266.32 assets:investment:ACME
|
|
### $-3266.32 equity:opening balances
|
|
###--------------------
|
|
### $0.00
|
|
###
|
|
### ledger "2.6.0.90" with -s: full precision, ignores price and D
|
|
### $3266.3178 assets:investment:ACME
|
|
### $-3266.3178 equity:opening balances
|
|
###
|
|
### ledger 3: precision=1, ignores price, observes D
|
|
### $3266.3 assets:investment:ACME
|
|
### $-3266.3 equity:opening balances
|
|
###--------------------
|
|
### 0
|
|
|
|
#
|
|
# 7. when there are multiple postings in the commodity being priced,
|
|
# show the averaged unit price, with precision equal to the sum of
|
|
# the max precisions of the commodities being converted (#262).
|
|
# Here the (irrational) price should be displayed with just precision 4
|
|
# (C's precision 2 + D's precision 2).
|
|
hledgerdev -f- print
|
|
<<<
|
|
1/1
|
|
c C 10.00
|
|
c C 11.00
|
|
d D -320.00
|
|
>>>
|
|
2015/01/01
|
|
c C 10.00 @ D 15.2381
|
|
c C 11.00 @ D 15.2381
|
|
d D -320.00
|
|
|
|
>>>=0
|
|
|
|
|
|
## 8. Here the price should be displayed with precision 7
|
|
# (E's precision 4 + F's precision 3).
|
|
hledgerdev -f- print
|
|
<<<
|
|
1/1
|
|
e E 10.0000
|
|
e E 11
|
|
f F -320.000
|
|
>>>
|
|
2015/01/01
|
|
e E 10.0000 @ F 15.2380952
|
|
e E 11.0000 @ F 15.2380952
|
|
f F -320.000
|
|
|
|
>>>=0
|