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]

后记:到此,数值类介绍完毕,希望能对大家有点帮助

 

 

 

 

 

 

 

 

 

posted @ 2013-04-23 20:42  鞋带松了  阅读(971)  评论(0编辑  收藏  举报