https://github.com/beancount/beancount/issues/584

On Wed, Nov 25, 2020 at 1:57 AM Martin Blais <[email protected]> wrote:

> This is a bug.
> Here's why this happens:
> The error condition described in this method is hit:
> https://docs.python.org/3/library/decimal.html#decimal.Decimal.quantize
>
> "Unlike other operations, if the length of the coefficient after the
> quantize operation would be greater than precision, then an
> InvalidOperation is signaled. This guarantees that, unless there is an
> error condition, the quantized exponent is always equal to that of the
> right-hand operand."
>
> What's happening is that the precision automatically inferred from the
> numbers you've provided (the ones with the large fraction) exceed that of
> the context.
> e.g. with this patch it runs:
> bergamot [git|v2]:~/p/beancount$ git diff
> diff --git a/beancount/core/display_context.py
> b/beancount/core/display_context.py
> index cfed0188..9a9dbfce 100644
> --- a/beancount/core/display_context.py
> +++ b/beancount/core/display_context.py
> @@ -217,6 +217,10 @@ class DisplayContext:
>              # Note: We could probably logging.warn() this situation here.
>              return number
>          qdigit = Decimal(1).scaleb(-num_fractional_digits)
> +
> +        import decimal; decimal.getcontext().prec = 30
> +        print("XXX", qdigit, decimal.getcontext().prec)
> +
>          return number.quantize(qdigit)
>
>
> I'll have to find a solution.
>
>
>
>
>
> On Sun, Nov 15, 2020 at 12:26 PM François <[email protected]> wrote:
>
>> Hello,
>>
>> There is some strange behaviour with include directive.
>>
>> For example with those two files
>>
>> cat <<EOF >example.beancount
>> 1970-01-01 open Expenses:MyExpense
>> 1970-01-01 open Assets:MyAccount
>>
>> 1970-01-02 *
>>   Expenses:MyExpense   1000.00 EUR
>>   Assets:MyAccount    -1000.00 EUR
>>
>> 1970-01-02 * "Verif "
>>   Expenses:MyExpense     333.0000000000000182076576039 EUR
>>   Assets:MyAccount      -333.0000000000000182076576039 EUR
>> EOF
>>
>> cat <<EOF >example_with_include.beancount
>> include "example.beancount"
>> EOF
>>
>> The results differ when we use the include file or not.
>>
>> In the case without include (bean-query example.beancount 'SELECT *')
>> I have a stack trace with this error
>>    decimal.InvalidOperation: [<class 'decimal.InvalidOperation'>]
>>
>>
>> In the case with include I have an output
>>
>> $ bean-query example_with_include.beancount 'SELECT *'
>>    date    f  narrat              position
>> ---------- - - ------ -----------------------------------
>> 1970-01-02 *           1000.00                        EUR
>> 1970-01-02 *          -1000.00                        EUR
>> 1970-01-02 *   Verif    333.0000000000000182076576039 EUR
>> 1970-01-02 *   Verif   -333.0000000000000182076576039 EUR
>>
>>
>>
>>
>>
>>
>> I stumbled on this while splitting some beancount ledger on multiple
>> files. In my case the transaction with a lot of decimal is generated by
>> a plugin which makes some division of existing postings to split them
>> between several accounts.
>>         dest_amount=core.amount.mul(original_posting.units,
>> core.number.D(1/3))
>>
>> In this case I have the following outputs :
>>
>> $ bean-query exPlugin.beancount 'SELECT * WHERE account ~ ":A"'
>>    date    f  narrat  position
>> ---------- - - ------ ----------
>> 1970-01-02 *   Verif  333.33 EUR
>>
>> $ bean-query exPlugin_with_include.beancount 'SELECT * WHERE account ~
>> ":A"'
>>    date    f  narrat             position
>> ---------- - - ------ ---------------------------------
>> 1970-01-02 *   Verif  333.3333333333333148296162562 EUR
>>
>>
>> The directive are exactly the same in both cases. The only change is
>> that in the first case I have only one file and in the second case I
>> have the transaction in an included file.
>>
>> I like more the first version (with proper rounding) but what triggers
>> me is the lack of coherence.
>>
>>
>> Have you any explanation or workaround about this ?
>>
>>
>> I use Beancount 2.2.3+hg20200223.0.3af921a
>>
>> François
>>
>> --
>> You received this message because you are subscribed to the Google Groups
>> "Beancount" group.
>> To unsubscribe from this group and stop receiving emails from it, send an
>> email to [email protected].
>> To view this discussion on the web visit
>> https://groups.google.com/d/msgid/beancount/20201115172254.7xtksqidbiwp2kjd%40fjo-extia-HPdeb.example.avalenn.eu
>> .
>>
>

-- 
You received this message because you are subscribed to the Google Groups 
"Beancount" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To view this discussion on the web visit 
https://groups.google.com/d/msgid/beancount/CAK21%2BhNf%2BbWPEFM7-VtD_rVsfDjQ4pZATWRHtBdp9VKPREK8Lw%40mail.gmail.com.

Reply via email to