Ruby 2.4

Float

class Float

Parent:Numeric

BigDecimal扩展本地Float类以提供to_d方法。

当您在应用程序中需要BigDecimal时,此方法将在Float对象上可用。

浮点对象使用本机体系结构的双精度浮点表示法表示不精确的实数。

浮点有不同的算术,是一个不精确的数字。所以你应该知道它的深奥系统。见以下内容:

  • :up或者nil:结果将从零圆整

  • :even:结果将舍入到最接近的偶数

  • :down:结果将四舍五入到零

static VALUE flo_round(int argc, VALUE *argv, VALUE num) { double number, f, x; VALUE nd, opt; int ndigits = 0; enum ruby_num_rounding_mode mode; if (rb_scan_args(argc, argv, "01:", &nd, &opt)) { ndigits = NUM2INT(nd } mode = rb_num_get_rounding_option(opt if (ndigits < 0) { return rb_int_round(flo_to_i(num), ndigits, mode } number = RFLOAT_VALUE(num if (ndigits == 0) { x = ROUND_CALL(mode, round, (number, 1.0) return dbl2ival(x } if (float_invariant_round(number, ndigits, &num)) return num; f = pow(10, ndigits x = ROUND_CALL(mode, round, (number, f) return DBL2NUM(x / f }

to_d → bigdecimal

转换flt为BigDecimal并返回。

require 'bigdecimal' require 'bigdecimal/util' 0.5.to_d # => 0.5e0

# File ext/bigdecimal/lib/bigdecimal/util.rb, line 38 def to_d(precision=nil) BigDecimal(self, precision || Float::DIG) end

to_f → self

既然float已经是一个浮动,返回self

static VALUE flo_to_f(VALUE num) { return num; }

to_i → integer

to_int → integer

返回float截断到一个整数。

同义词是to_i和to_int

static VALUE flo_to_i(VALUE num) { double f = RFLOAT_VALUE(num long val; if (f > 0.0) f = floor(f if (f < 0.0) f = ceil(f if (!FIXABLE(f)) { return rb_dbl2big(f } val = (long)f; return LONG2FIX(val }

to_int → integer Show source

返回float截断到一个整数。

同义词是to_i和to_int

static VALUE flo_to_i(VALUE num) { double f = RFLOAT_VALUE(num long val; if (f > 0.0) f = floor(f if (f < 0.0) f = ceil(f if (!FIXABLE(f)) { return rb_dbl2big(f } val = (long)f; return LONG2FIX(val }

to_r → rational Show source

将该值作为理性返回。

注意:0.3.to_r与'0.3'.to_r不一样。后者相当于'3/10'to_r,但前者并非如此。

2.0.to_r #=> (2/1) 2.5.to_r #=> (5/2) -0.75.to_r #=> (-3/4) 0.0.to_r #=> (0/1)

参见rationalize。

static VALUE float_to_r(VALUE self) { VALUE f, n; float_decode_internal(self, &f, &n #if FLT_RADIX == 2 { long ln = FIX2LONG(n if (ln == 0) return rb_rational_new1(f if (ln > 0) return rb_rational_new1(rb_int_lshift(f, n) ln = -ln; return rb_rational_new2(f, rb_int_lshift(ONE, INT2FIX(ln)) } #else f = rb_int_mul(f, rb_int_pow(INT2FIX(FLT_RADIX), n) if (RB_TYPE_P(f, T_RATIONAL)) return f; return rb_rational_new1(f #endif }

to_s → string

返回一个包含self的表示的字符串。以及的固定或指数形式float,该呼叫可能会返回NaNInfinity-Infinity

static VALUE flo_to_s(VALUE flt) { enum {decimal_mant = DBL_MANT_DIG-DBL_DIG}; enum {float_dig = DBL_DIG+1}; char buf[float_dig + (decimal_mant + CHAR_BIT - 1) / CHAR_BIT + 10]; double value = RFLOAT_VALUE(flt VALUE s; char *p, *e; int sign, decpt, digs; if (isinf(value)) { static const char minf[] = "-Infinity"; const int pos = (value > 0 /* skip "-" */ return rb_usascii_str_new(minf+pos, strlen(minf)-pos } else if (isnan(value)) return rb_usascii_str_new2("NaN" p = ruby_dtoa(value, 0, 0, &decpt, &sign, &e s = sign ? rb_usascii_str_new_cstr("-") : rb_usascii_str_new(0, 0 if ((digs = (int)(e - p)) >= (int)sizeof(buf)) digs = (int)sizeof(buf) - 1; memcpy(buf, p, digs xfree(p if (decpt > 0) { if (decpt < digs) { memmove(buf + decpt + 1, buf + decpt, digs - decpt buf[decpt] = '.'; rb_str_cat(s, buf, digs + 1 } else if (decpt <= DBL_DIG) { long len; char *ptr; rb_str_cat(s, buf, digs rb_str_resize(s, (len = RSTRING_LEN(s)) + decpt - digs + 2 ptr = RSTRING_PTR(s) + len; if (decpt > digs) { memset(ptr, '0', decpt - digs ptr += decpt - digs; } memcpy(ptr, ".0", 2 } else { goto exp; } } else if (decpt > -4) { long len; char *ptr; rb_str_cat(s, "0.", 2 rb_str_resize(s, (len = RSTRING_LEN(s)) - decpt + digs ptr = RSTRING_PTR(s memset(ptr += len, '0', -decpt memcpy(ptr -= decpt, buf, digs } else { exp: if (digs > 1) { memmove(buf + 2, buf + 1, digs - 1 } else { buf[2] = '0'; digs++; } buf[1] = '.'; rb_str_cat(s, buf, digs + 1 rb_str_catf(s, "e%+03d", decpt - 1 } return s; }

还有别名:inspect

truncate(ndigits) → integer or float

float以十进制数字截取给定的精度(默认为0位)。

精度可能是负面的。当ndigits大于零时返回一个浮点数。

static VALUE flo_truncate(int argc, VALUE *argv, VALUE num) { if (signbit(RFLOAT_VALUE(num))) return flo_ceil(argc, argv, num else return flo_floor(argc, argv, num }

zero? → true or false

返回true如果float是0.0。

static VALUE flo_zero_p(VALUE num) { if (RFLOAT_VALUE(num) == 0.0) { return Qtrue; } return Qfalse; }