diff options
Diffstat (limited to 'ext')
-rw-r--r-- | ext/bigdecimal/bigdecimal.c | 26 |
1 files changed, 16 insertions, 10 deletions
diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c index 8c79450660..bcc2b32fe6 100644 --- a/ext/bigdecimal/bigdecimal.c +++ b/ext/bigdecimal/bigdecimal.c @@ -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; |