当您使用较小数字的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;
答案 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
。