diff options
-rw-r--r-- | ext/bigdecimal/bigdecimal.c | 5 | ||||
-rw-r--r-- | test/bigdecimal/test_bigdecimal.rb | 4 |
2 files changed, 8 insertions, 1 deletions
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 63de77cc8b..72c7b34806 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -2736,12 +2736,15 @@ rb_uint64_convert_to_BigDecimal(uint64_t uval, RB_UNUSED_VAR(size_t digs), int r vp->exponent = len; VpSetSign(vp, 1); - size_t i; + size_t i, ntz = 0; for (i = 0; i < len; ++i) { DECDIG r = uval % BASE; vp->frac[len - i - 1] = r; + if (r == 0) ++ntz; uval /= BASE; } + + vp->Prec -= ntz; } return BigDecimal_wrap_struct(obj, vp); diff --git a/test/bigdecimal/test_bigdecimal.rb b/test/bigdecimal/test_bigdecimal.rb index 74c991f47f..fbe0d7e98a 100644 --- a/test/bigdecimal/test_bigdecimal.rb +++ b/test/bigdecimal/test_bigdecimal.rb @@ -1951,6 +1951,10 @@ class TestBigDecimal < Test::Unit::TestCase assert_equal(1, BigDecimal(-1).precision) assert_equal(2, BigDecimal(10).precision) assert_equal(2, BigDecimal(-10).precision) + assert_equal(9, BigDecimal(100_000_000).precision) + assert_equal(9, BigDecimal(-100_000_000).precision) + assert_equal(12, BigDecimal(100_000_000_000).precision) + assert_equal(12, BigDecimal(-100_000_000_000).precision) assert_equal(21, BigDecimal(100_000_000_000_000_000_000).precision) assert_equal(21, BigDecimal(-100_000_000_000_000_000_000).precision) assert_equal(103, BigDecimal("111e100").precision) |