1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

[bigdecimal] Fix the default precision of Float#to_d

Fix https://github.com/ruby/bigdecimal/issues/70
[Bug #13331]

https://github.com/ruby/bigdecimal/commit/aa536cd4b5
This commit is contained in:
Kenta Murata 2020-12-18 23:46:26 +09:00
parent 4735a5b9d2
commit e1424c3501
No known key found for this signature in database
GPG key ID: CEFE8AFB6081B062
3 changed files with 14 additions and 6 deletions

View file

@ -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);

View file

@ -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

View file

@ -17,10 +17,12 @@ class TestBigDecimalUtil < Test::Unit::TestCase
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)
@ -43,6 +45,12 @@ class TestBigDecimalUtil < Test::Unit::TestCase
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)