如何从Ruby BigDecimal对象获得精度(十进制数字)?

时间:2014-10-15 09:01:53

标签: ruby

给出新BigDecimal对象的以下表达式:

b = BigDecimal.new("3.3")

如何获得为其定义的精度?我想知道一个返回1的方法,因为小数点后有1位数。我之所以这样,是因为b.precisionb.digits不起作用。


Thanks to Stefan,处理此类信息的方法名称为BigDecimal#precs。鉴于BigDecimal对象来自数据库,我不知道该数据库对象的精度。我尝试了以下方法,但对我的情况似乎没有用。

b = BigDecimal.new(3.14, 2)
b.precs
=> [18, 27]

如何检索2信息/参数?

1 个答案:

答案 0 :(得分:2)

在Ruby 2.2.2中(并且,我猜测,在以前的版本中),你无法得到 返回给BigDecimal::new的精度。那是 因为它用于某些计算;只有那些结果 计算存储。这篇文章评论是一个线索:

  

计算中使用的实际有效位数是   通常大于指定的数字。

让我们看看来源,看看发生了什么。 BigDecimal_new 提取参数,进行一些限制和类型检查,以及调用 VpAlloc。 mf 保存BigDecimal :: new的 digits 参数:

return VpAlloc(mf, RSTRING_PTR(iniValue));

VpAlloc中, mf 获取 重命名为 mx

VpAlloc(size_t mx, const char *szVal)

MxAlloc做的第一件事是将 mx (精度)舍入到 BASE_FIG的最接近的倍数:

mx = (mx + BASE_FIG - 1) / BASE_FIG;    /* Determine allocation unit. */
if (mx == 0) ++mx;

BASE_FIG相当于RMPD_COMPONENT_FIGURES,它有一个平台 依赖值38,19,9,4或2.

mx在存储之前还有进一步的计算 正在创建BigDecimal,但我们已经可以看到原始的 传递给:: new的参数被销毁,不可恢复。