2012-09-03 40 views
0

我看到下面的代码docs for the BigDecimal class是否需要使用BigDecimal.new方法?

同理:

(::new(“1.2”) - BigDecimal(“1.0”)) == BigDecimal(“0.2”) -> true 
(1.2 - 1.0) == 0.2 -> false 

所以我在想,如果这里有必要使用new方法是这样的:BigDecimal.new 2.5, 2。还是仅仅使用BigDecimal 2.5, 2就是不好的做法?当评估相同BigDecimal值,他们都得到新的引用:

BigDecimal 2.5, 2 
#=> #<BigDecimal:7ffa93e524b0,'0.25E1',18(36)> 
BigDecimal 2.5, 2 
#=> #<BigDecimal:7ffa97236600,'0.25E1',18(36)> 

回答

1

那么,在最新kernel doc我们可以看到,BigDecimal的方法是这样的:

static VALUE 
BigDecimal_global_new(int argc, VALUE *argv, VALUE self) 
{ 
    return BigDecimal_new(argc, argv, rb_cBigDecimal); 
} 

换句话说,BigDecimal.new会通过提供的参数调用。所以,是的,这并不是明确必要的。

+0

感谢您的快速回答。我还发现了一个更简单的方法来初始化BigDecimals(我在spec-tests中有很多它们)。 '0.01.to_d(2)' – loybert

+2

@loybert在这里要小心,因为你刚刚开始使用浮点数,所以在转换为BigDecimal之前,可能已经失去了精度。 –

+0

@AndrewMarshall我试图用最小的例子'1.2 - 0.2 == 0.2#=> false'来挑衅一个数字错误,它会像'1.2.to_d - 0.2.to_d == 0.2.to_d#=> true'一样工作。任何其他想法或情景,这将失败,我的处理?我只使用这种语法,当我将值引入算法时,所以精确计算的BigDecimal将与其他BigDecimal一致计算,并且不会由于内部类型转换为精确的float('#BigDecimal * BigDecimal => BigDecimal','#BigDecimal * float => float')。 – loybert

相关问题