模块 Kernel

公共实例方法

BigDecimal(value, exception: true) → bigdecimal 点击切换源代码
BigDecimal(value, ndigits, exception: true) → bigdecimal

返回从 value 转换来的 BigDecimal,精度为 ndigits 个小数位。

ndigits 小于值中的有效位数时,结果将根据当前舍入模式舍入到该位数;请参阅 BigDecimal.mode

ndigits 为 0 时,将自动确定正确表示浮点数所需的位数。

返回 value 转换为 BigDecimal,具体取决于 value 的类型

  • IntegerFloatRationalComplex 或 BigDecimal:直接转换

    # Integer, Complex, or BigDecimal value does not require ndigits; ignored if given.
    BigDecimal(2)                     # => 0.2e1
    BigDecimal(Complex(2, 0))         # => 0.2e1
    BigDecimal(BigDecimal(2))         # => 0.2e1
    # Float or Rational value requires ndigits.
    BigDecimal(2.0, 0)                # => 0.2e1
    BigDecimal(Rational(2, 1), 0)     # => 0.2e1
    
  • 字符串:如果包含整数或浮点字面量,则通过解析进行转换;忽略前导和尾随空格

    # String does not require ndigits; ignored if given.
    BigDecimal('2')     # => 0.2e1
    BigDecimal('2.0')   # => 0.2e1
    BigDecimal('0.2e1') # => 0.2e1
    BigDecimal(' 2.0 ') # => 0.2e1
    
  • 响应方法 :to_str 的其他类型:首先转换为字符串,然后转换为 BigDecimal,如上所述。

  • 其他类型

    • 如果关键字参数 exceptiontrue,则引发异常。

    • 如果关键字参数 exceptionfalse,则返回 nil

如果 value 评估为 Floatdigits 大于 Float::DIG + 1,则引发异常。

static VALUE
f_BigDecimal(int argc, VALUE *argv, VALUE self)
{
    VALUE val, digs_v, opts = Qnil;
    argc = rb_scan_args(argc, argv, "11:", &val, &digs_v, &opts);
    int exception = opts_exception_p(opts);

    size_t digs = SIZE_MAX; /* this means digs is omitted */
    if (argc > 1) {
        digs_v = rb_to_int(digs_v);
        if (FIXNUM_P(digs_v)) {
            long n = FIX2LONG(digs_v);
            if (n < 0)
                goto negative_digs;
            digs = (size_t)n;
        }
        else {
            if (RBIGNUM_NEGATIVE_P(digs_v)) {
              negative_digs:
                if (!exception)
                    return Qnil;
                rb_raise(rb_eArgError, "negative precision");
            }
            digs = NUM2SIZET(digs_v);
        }
    }

    return rb_convert_to_BigDecimal(val, digs, exception);
}