Skip to content

Commit

Permalink
[bigdecimal] Fix the default precision of Float#to_d
Browse files Browse the repository at this point in the history
  • Loading branch information
mrkn committed Dec 19, 2020
1 parent 4735a5b commit e1424c3
Show file tree
Hide file tree
Showing 3 changed files with 14 additions and 6 deletions.
2 changes: 1 addition & 1 deletion ext/bigdecimal/bigdecimal.c
Expand Up @@ -1278,7 +1278,7 @@ BigDecimal_mult(VALUE self, VALUE r)

GUARD_OBJ(a, GetVpValue(self, 1));
if (RB_TYPE_P(r, T_FLOAT)) {
b = GetVpValueWithPrec(r, DBL_DIG+1, 1);
b = GetVpValueWithPrec(r, DBLE_FIG, 1);
}
else if (RB_TYPE_P(r, T_RATIONAL)) {
b = GetVpValueWithPrec(r, a->Prec*VpBaseFig(), 1);
Expand Down
2 changes: 1 addition & 1 deletion ext/bigdecimal/lib/bigdecimal/util.rb
Expand Up @@ -43,7 +43,7 @@ class Float < Numeric
#
# See also BigDecimal::new.
#
def to_d(precision=Float::DIG)
def to_d(precision=Float::DIG+1)
BigDecimal(self, precision)
end
end
Expand Down
16 changes: 12 additions & 4 deletions test/bigdecimal/test_bigdecimal_util.rb
Expand Up @@ -17,10 +17,12 @@ def test_Integer_to_d
end

def test_Float_to_d_without_precision
delta = 1.0/10**(Float::DIG)
assert_in_delta(BigDecimal(0.5, Float::DIG), 0.5.to_d, delta)
assert_in_delta(BigDecimal(355.0/113.0, Float::DIG), (355.0/113.0).to_d, delta)
assert_equal(9.05.to_d.to_s('F'), "9.05")
delta = 1.0/10**(Float::DIG+1)
assert_in_delta(BigDecimal(0.5, Float::DIG+1), 0.5.to_d, delta)
assert_in_delta(BigDecimal(355.0/113.0, Float::DIG+1), (355.0/113.0).to_d, delta)

assert_equal(9.05, 9.05.to_d.to_f)
assert_equal("9.050000000000001", 9.05.to_d.to_s('F'))

bug9214 = '[ruby-core:58858]'
assert_equal((-0.0).to_d.sign, -1, bug9214)
Expand All @@ -43,6 +45,12 @@ def test_Float_to_d_with_precision
assert(1.1.to_d(digits).frozen?)
end

def test_Float_to_d_bug13331
assert_equal(64.4.to_d,
1.to_d * 64.4,
"[ruby-core:80234] [Bug #13331]")
end

def test_Rational_to_d
digits = 100
delta = 1.0/10**(digits)
Expand Down

0 comments on commit e1424c3

Please sign in to comment.