0

当您取一个小数的 sqrt 但指定非常高的精度时,BigDecimal 发生了一些奇怪的事情......

当我说奇怪时,我的意思是 36 的 sqrt 是 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; 
4

3 回答 3

3

36 的平方根是 6。当 Ruby 以这种精度评估它时,它得到 5.9999... 当你调用to_i时,你将值四舍五入,取而代之的是 5。

于 2012-07-19T17:32:52.307 回答
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);
}
于 2012-07-19T17:26:49.300 回答
0

当您调用 时to_i,您将删除平方根创建的所有小数精度。当你打电话时, s 之后的to_i几乎无限的踪迹(看到我的删除)。如果你想这样做,你可能想在调用之前先调用。95to_iroundto_i

于 2012-07-19T17:29:39.767 回答