2017-02-24 16 views

回答

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); 
} 
0

這是因爲BigDecimal的#DIV需要第二個參數,精度,缺省值爲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開發者開放一個問題。