зеркало из https://github.com/github/ruby.git
[ruby/bigdecimal] Fix for the coerce cases in divide and DoDivmod
https://github.com/ruby/bigdecimal/commit/1cb92487f7
This commit is contained in:
Родитель
9d0c5e2754
Коммит
b130644584
|
@ -1356,16 +1356,19 @@ BigDecimal_divide(VALUE self, VALUE r, Real **c, Real **res, Real **div)
|
|||
TypedData_Get_Struct(self, Real, &BigDecimal_data_type, a);
|
||||
SAVE(a);
|
||||
|
||||
VALUE rr = Qnil;
|
||||
if (RB_TYPE_P(r, T_FLOAT)) {
|
||||
VALUE rr = r;
|
||||
if (is_kind_of_BigDecimal(rr)) {
|
||||
/* do nothing */
|
||||
}
|
||||
else if (RB_INTEGER_TYPE_P(r)) {
|
||||
rr = rb_inum_convert_to_BigDecimal(r, 0, true);
|
||||
}
|
||||
else if (RB_TYPE_P(r, T_FLOAT)) {
|
||||
rr = rb_float_convert_to_BigDecimal(r, 0, true);
|
||||
}
|
||||
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
||||
rr = rb_rational_convert_to_BigDecimal(r, a->Prec*BASE_FIG, true);
|
||||
}
|
||||
else {
|
||||
rr = rb_convert_to_BigDecimal(r, 0, false);
|
||||
}
|
||||
|
||||
if (!is_kind_of_BigDecimal(rr)) {
|
||||
return DoSomeOne(self, r, '/');
|
||||
|
@ -1429,16 +1432,19 @@ BigDecimal_DoDivmod(VALUE self, VALUE r, Real **div, Real **mod)
|
|||
TypedData_Get_Struct(self, Real, &BigDecimal_data_type, a);
|
||||
SAVE(a);
|
||||
|
||||
VALUE rr = Qnil;
|
||||
if (RB_TYPE_P(r, T_FLOAT)) {
|
||||
VALUE rr = r;
|
||||
if (is_kind_of_BigDecimal(rr)) {
|
||||
/* do nothing */
|
||||
}
|
||||
else if (RB_INTEGER_TYPE_P(r)) {
|
||||
rr = rb_inum_convert_to_BigDecimal(r, 0, true);
|
||||
}
|
||||
else if (RB_TYPE_P(r, T_FLOAT)) {
|
||||
rr = rb_float_convert_to_BigDecimal(r, 0, true);
|
||||
}
|
||||
else if (RB_TYPE_P(r, T_RATIONAL)) {
|
||||
rr = rb_rational_convert_to_BigDecimal(r, a->Prec*BASE_FIG, true);
|
||||
}
|
||||
else {
|
||||
rr = rb_convert_to_BigDecimal(r, 0, false);
|
||||
}
|
||||
|
||||
if (!is_kind_of_BigDecimal(rr)) {
|
||||
return Qfalse;
|
||||
|
|
|
@ -963,6 +963,15 @@ class TestBigDecimal < Test::Unit::TestCase
|
|||
assert_kind_of(BigDecimal, BigDecimal("3") / 1.quo(3))
|
||||
end
|
||||
|
||||
def test_div_with_complex
|
||||
q = BigDecimal("3") / 1i
|
||||
assert_kind_of(Complex, q)
|
||||
end
|
||||
|
||||
def test_div_error
|
||||
assert_raise(TypeError) { BigDecimal(20) / '2' }
|
||||
end
|
||||
|
||||
def test_mod
|
||||
x = BigDecimal((2**100).to_s)
|
||||
assert_equal(1, x % 3)
|
||||
|
@ -1006,6 +1015,10 @@ class TestBigDecimal < Test::Unit::TestCase
|
|||
assert_raise(ZeroDivisionError){BigDecimal("0").divmod(0)}
|
||||
end
|
||||
|
||||
def test_divmod_error
|
||||
assert_raise(TypeError) { BigDecimal(20).divmod('2') }
|
||||
end
|
||||
|
||||
def test_add_bigdecimal
|
||||
x = BigDecimal((2**100).to_s)
|
||||
assert_equal(3000000000000000000000000000000, x.add(x, 1))
|
||||
|
|
Загрузка…
Ссылка в новой задаче