BigDecimal" /"被定义为?

时间:2017-02-24 16:28:26

标签: ruby

我认为'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中有类似的吗?

2 个答案:

答案 0 :(得分:1)

您可以在链接到的存储库中的bigdecimal库的源代码中找到它。 On line 3403 of ext/bigdecimal/bigdecimal.cBigDecimal#/绑定到函数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开发者打开一个问题。