summaryrefslogtreecommitdiff
path: root/test/unit/t_balance.cc
diff options
context:
space:
mode:
authorMax Nikulin <manikulin@gmail.com>2024-07-08 17:17:30 +0700
committerJohn Wiegley <johnw@newartisans.com>2024-08-05 08:35:14 -0700
commite6dae78c033ea970a459b1a0ccc2f1310d1bff96 (patch)
tree510dc67c111f786f3a2ecdb861b4602c73a04e64 /test/unit/t_balance.cc
parent064012a0d8c18aac253de79154175400fe7ad9cc (diff)
downloadfork-ledger-e6dae78c033ea970a459b1a0ccc2f1310d1bff96.tar.gz
fork-ledger-e6dae78c033ea970a459b1a0ccc2f1310d1bff96.tar.bz2
fork-ledger-e6dae78c033ea970a459b1a0ccc2f1310d1bff96.zip
Fix denominator of roundto result
Multiprecision rational created from a double value may have large power of 2 denominator since fractional decimal numbers can not be represented as binary floating point numbers. It leads to failed assertion when result is compared to a value converted directly from strings. Use integer multiprecision arithmetics to round numbers to ensure proper denominator. Inspired by python gmpy2 package <https://github.com/aleaxit/gmpy/blob/3e4564ae9d/src/gmpy2_mpq_misc.c#L315> The change makes `roundto` symmetric for positive/negative arguments. Halves are rounded to nearest even. Rounded away from zero are discussed in #1663 and it may be achieved with minimal modification. - See #2329 - Closes #1983
Diffstat (limited to 'test/unit/t_balance.cc')
-rw-r--r--test/unit/t_balance.cc10
1 files changed, 10 insertions, 0 deletions
diff --git a/test/unit/t_balance.cc b/test/unit/t_balance.cc
index b503d02a..066f066e 100644
--- a/test/unit/t_balance.cc
+++ b/test/unit/t_balance.cc
@@ -451,6 +451,9 @@ BOOST_AUTO_TEST_CASE(testRound)
b2 += a5;
b2 += a6;
+ // <https://github.com/ledger/ledger/issues/2362>
+ // This block modifies b1 and b2, likely it is a bug,
+ // but otherwise some assertions fails.
a1.in_place_roundto(2);
a2.in_place_roundto(2);
a3.in_place_roundto(2);
@@ -465,11 +468,18 @@ BOOST_AUTO_TEST_CASE(testRound)
b4 += a5;
b4 += a6;
+ // After fix of #2362 rounded() and in_place_round()
+ // likely should be replaced with roundto(2) and
+ // in_place_roundto(2).
+ // It looks like rounded() and in_place_round()
+ // need some other tests, perhaps with unround().
BOOST_CHECK_EQUAL(b0.rounded(), b0);
BOOST_CHECK_EQUAL(b2.rounded(), b4);
+ // Relies on b1 modified by amount_t::in_place_roundto(int).
BOOST_CHECK_EQUAL(b1.rounded(), b4);
b1.in_place_round();
+ // Relies on b1 modified by amount_t::in_place_roundto(int).
BOOST_CHECK_EQUAL(b1, b3);
BOOST_CHECK(b0.valid());