模块 Kernel
公共实例方法
BigDecimal(value, exception: true) → bigdecimal 点击切换源代码
BigDecimal(value, ndigits, exception: true) → bigdecimal
返回从 value
转换来的 BigDecimal,精度为 ndigits
个小数位。
当 ndigits
小于值中的有效位数时,结果将根据当前舍入模式舍入到该位数;请参阅 BigDecimal.mode
。
当 ndigits
为 0 时,将自动确定正确表示浮点数所需的位数。
返回 value
转换为 BigDecimal,具体取决于 value
的类型
-
Integer
、Float
、Rational
、Complex
或 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,如上所述。 -
其他类型
-
如果关键字参数
exception
为true
,则引发异常。 -
如果关键字参数
exception
为false
,则返回nil
。
-
如果 value
评估为 Float
且 digits
大于 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); }