我认为'3.0'.to_d.div(2)
与'3.0'.to_d / 2
相同,但前者返回1
而后者返回1.5
。
我在Bigdecimal的github存储库中搜索def /
,但我找不到它。
https://github.com/ruby/bigdecimal/search?utf8=%E2%9C%93&q=def+%2F&type=Code
我在哪里可以找到定义?哪个方法相当于Bigdecimal中的/
?
在Float
中有fdiv
方法。 Bigdecimal
中有类似的吗?
答案 0 :(得分:1)
您可以在链接到的存储库中的bigdecimal
库的源代码中找到它。 On line 3403 of ext/bigdecimal/bigdecimal.c
,BigDecimal#/
绑定到函数BigDecimal_div
:
rb_define_method(rb_cBigDecimal, "/", BigDecimal_div, 1);
This function looks like this:
static VALUE
BigDecimal_div(VALUE self, VALUE r)
/* For c = self/r: with round operation */
{
ENTER(5);
Real *c=NULL, *res=NULL, *div = NULL;
r = BigDecimal_divide(&c, &res, &div, self, r);
if (!NIL_P(r)) return r; /* coerced by other */
SAVE(c); SAVE(res); SAVE(div);
/* a/b = c + r/b */
/* c xxxxx
r 00000yyyyy ==> (y/b)*BASE >= HALF_BASE
*/
/* Round */
if (VpHasVal(div)) { /* frac[0] must be zero for NaN,INF,Zero */
VpInternalRound(c, 0, c->frac[c->Prec-1], (BDIGIT)(VpBaseVal() * (BDIGIT_DBL)res->frac[0] / div->frac[0]));
}
return ToValue(c);
}
答案 1 :(得分:0)
这是因为BigDecimal#div采用第二个参数precision,默认为1.
irb(main):017:0> '3.0'.to_d.div(2, 2)
=> 0.15e1
但是,当在BigDecimal上定义/时,
rb_define_method(rb_cBigDecimal, "/", BigDecimal_div, 1);
他们使用1作为参数的#,而不是-1,这意味着“可变数量的参数”。所以BigDecimal #div认为它需要一个必需参数和一个可选参数,而BigDecimal#/需要一个必需参数,并且忽略可选arg。因为可选参数被忽略,所以它没有正确初始化,它得到一个空int或0。
这可能被视为一个错误。您应该考虑与ruby开发者打开一个问题。