ruby基础之数值(Numeric)类
ruby数值类:
ruby中的Numeric子类有Integer和Float,Integer根据长度可以分为Fixnum(普通整数)和Bignum(大整数),程序中使用的整数大小一般是Fixnum类,即便超过了Fixnum的处理范围,也会自动转化成Bignum处理,所以写程序几乎不必特别去在意这些整数类的差异
Numeric的算术运算
数值之间可以进行加(+),减(-),乘(*),除(/),求余(%),乘幂(**)运算,
但是要注意:
Integer + Float #=> Float,
Integer + Integer #=> Integer,
Float+ Float #=> Float
除法:
数值对象除了 / 与 %之外,还有其他除法可用
e.g.
x.divmod(y) // 以数组返回x除以y的商与余数。“商”是“x除以y”的结果往小的方向取最接近的整数;余数则是与y同号的值。余数的结果等于“x%y”。 ans = x.divmod(y) ,反之,x == ans[0]*y + ans[1]
x.modulo(y) // 等同于"x%y"
x.remainder(y) // 返回x除以y的余数,但余数会与“x”同号
注意: 除以0的时候,Integer类会作为错误处理,但Float类则会返回Infinity(无限大)或NaN(Not a Number)。
Math模块
Math模块的使用,可以明确指定模块的名称(Math.sqrt(2)),也可以通过include Math读取进来(include Math).
Math模块提供的方法:正弦函数 sin(x), 余弦函数 cos(x), 正函数 tan(x), 反正弦函数 asin(x), 反余弦函数 acos(x), 反正切函数 atan(x), 指数函数 exp(x), 自然对数 log(x), 常用对数 log10(x), 平方根 sqrt(x)
Math模块提供的常数:圆周率(3.1415926...) PI, 自然对数的底 e(2.7182818...) E
数值类型的转换
e.g. IntegerObject.to_f #=> FloatObject
FloatObject.to_i #=> IntegerObject
字符串也可以转换成数值
e.g. "10".to_i #=> 10
"123.2".to_f #=> 123.2
注意:Float#to_i会直接去掉小数点以下的值。
想要四舍五入,应该使用round方法 e.g. p 1.2.round #=> 1 , p 1.8.round #=>2, p -1.2.round #=> -1, p -1.8.round #=> -2
另外,还有一律返回比接受者大的最大整数的ceil方法,以及一律返回比接受者小的最大整数的floor方法
Integer类还可以使用位运算:位反转(逻辑非)~、 位元积(逻辑与)&、 位元和(逻辑或)|、 互斥逻辑和(异或运算)^、 位元右位移 >>、 位元左位移 <<【具体的可以查阅相关资料】
注意点:对于Float类型的小数部分处理的时候存在“舍入误差”,如图:
原因是:浮点数的小数部分在计算机内部实现时,是按1/2、1/4、1/8等与2的幂相乘的形式存在的。1/5、1/3等数在二进制中就不能被正确的表现出来。对持有有效位数的很大的十进制数,我们采用bigdecimal程序库,小数也好,整数也好,在处理除法运算时,我们采用了有理数来作为表现形式的Rational程序库,这些程序库文件也是ruby的标准附件之一。
数数
迭代器
1、n.times{|i| puts i} // 重复执行n次,参数 i 的值依次会是0到n-1
2、from.upto(to){|i| puts i} // 从from数到to为止不断相加,如果from大于to则一次也不数
3、from.downto(to){|i| puts i} // 从from数到to为止不断相减,如果from小于to则一次也不数
4、from.step(to, step){|i| puts i} // 从from开始,每次加上step,直到数到to为止。当step为正值且from大于to时,则一次也不数;当step为负值且from小于to时,则一次也不数
e.g.
ary = []
2.step(10, 3){|i| ary << i}
p ary #=> [2, 5, 8]
后记:到此,数值类介绍完毕,希望能对大家有点帮助