From 5e91cfa6e5f70cbd4013ed4f507d04e007a583dc Mon Sep 17 00:00:00 2001 From: "William T. Nelson" <35801+wtn@users.noreply.github.com> Date: Sat, 14 Nov 2026 11:28:09 -0600 Subject: [PATCH] Keep the sign in BigDecimal#to_digits for values in (-1, 0) to_digits built the integer part from to_i.to_s, which is "0" for any value between -1 and 0, so the minus sign was lost: BigDecimal("-0.5").to_digits returned "0.5". to_digits is documented as deprecated in favor of to_s("F"), so it now returns to_s("F"). Co-authored-by: Claude Opus 5.5 --- lib/bigdecimal/util.rb | 8 +------- test/bigdecimal/test_bigdecimal_util.rb | 7 +++++++ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/lib/bigdecimal/util.rb b/lib/bigdecimal/util.rb index 7f2232db..87164ae0 100644 --- a/lib/bigdecimal/util.rb +++ b/lib/bigdecimal/util.rb @@ -88,13 +88,7 @@ class BigDecimal < Numeric # d.to_digits # => "3.14" # def to_digits - if self.nan? || self.infinite? || self.zero? - self.to_s - else - i = self.to_i.to_s - _,f,_,z = self.frac.split - i + "." + ("0"*(-z)) + f - end + to_s("F") end # call-seq: diff --git a/test/bigdecimal/test_bigdecimal_util.rb b/test/bigdecimal/test_bigdecimal_util.rb index 67693935..16e14c4a 100644 --- a/test/bigdecimal/test_bigdecimal_util.rb +++ b/test/bigdecimal/test_bigdecimal_util.rb @@ -10,6 +10,13 @@ def test_BigDecimal_to_d assert_same(x, x.to_d) end + def test_BigDecimal_to_digits + assert_equal("3.14", BigDecimal("3.14").to_digits) + assert_equal("-3.14", BigDecimal("-3.14").to_digits) + assert_equal("-0.5", BigDecimal("-0.5").to_digits) + assert_equal("-0.05", BigDecimal("-0.05").to_digits) + end + def test_Integer_to_d assert_equal(BigDecimal(1), 1.to_d) assert_equal(BigDecimal(2<<100), (2<<100).to_d)