Ruby BigDecimal - 错误?

时间:2012-07-19 17:24:01

标签: ruby

当您使用较小数字的sqrt但指定非常高的精度时,BigDecimal会发生奇怪的事情......

当我说奇怪时,我的意思是36的平方是5。

任何人都可以解释这里发生的事情或这是一个错误......

require 'bigdecimal'
require 'bigdecimal/util'

@d = BigDecimal.new(36)
puts @d.sqrt(250).to_i

$ ruby1.9 test.rb 
5

$ ruby1.9 -v
ruby 1.9.3p0 (2011-10-30 revision 33570) [x86_64-darwin10]

$ uname -a
Darwin jack.bidcactus.local 10.8.0 Darwin Kernel Version 10.8.0: Tue Jun  7 16:33:36 PDT 2011; 

3 个答案:

答案 0 :(得分:3)

36的平方根是6.当Ruby用这个精度计算它时,得到5.9999 ...当你调用to_i时,你向下舍入值,得到5。

答案 1 :(得分:2)

它返回一个浮点数。这就是你看到“奇怪”行为的原因。这不是一个错误。 API

代码:

           static VALUE
math_sqrt(VALUE obj, VALUE x)
{
    double d0, d;

    Need_Float(x);
    d0 = RFLOAT_VALUE(x);
    /* check for domain error */
    if (d0 < 0.0) domain_error("sqrt");
    if (d0 == 0.0) return DBL2NUM(0.0);
    d = sqrt(d0);
    return DBL2NUM(d);
}

答案 2 :(得分:0)

当您调用to_i时,您将删除由平方根生成的所有小数精度。当您致电to_i时,9之后几乎无限追踪5 s(看到我删除to_i)。如果您想这样做,可能需要在致电round之前致电to_i