给出新BigDecimal
对象的以下表达式:
b = BigDecimal.new("3.3")
如何获得为其定义的精度?我想知道一个返回1
的方法,因为小数点后有1位数。我之所以这样,是因为b.precision
或b.digits
不起作用。
Thanks to Stefan,处理此类信息的方法名称为BigDecimal#precs
。鉴于BigDecimal
对象来自数据库,我不知道该数据库对象的精度。我尝试了以下方法,但对我的情况似乎没有用。
b = BigDecimal.new(3.14, 2)
b.precs
=> [18, 27]
如何检索2
信息/参数?
答案 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的参数被销毁,不可恢复。