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
,该呼叫可能会返回NaN
,Infinity
和-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;
}