Ruby 手册 | 15 - 数字类型

500 阅读4分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第15天,点击查看活动详情

一、数字类型

Ruby 中的基本数据类型包括数字、字符串、数组、符号、散列表、区间和正则表达式,Ruby 中一切皆对象,这些基本的类型都是以类的形式定义的。

Ruby 中的数字分为整数 Integer、浮点数 Float、复数 Complex、BigDecimal 和 有理数 Rational 几种,它们都继承自 Numeric 类,整数对应其他语言如 Java 中的 Integer,Float 对应 Double 类型的双精度小数,支持科学计算表示法。

图片.png

整型

Ruby 中的正式都是 Integer 类,表示整数,在 Ruby 2.4 版本之前 Integer 还可以分为 Fixnum 和 Bignum 两个子类,它们的区别就是所处理的数字大小范围不同,在 64 位系统中 Fixnum 表示的范围为 -2**64 ~ 2**62-1 超出这个范围的数字为 Bignum 类型。

在 Ruby 2.4 版本之后不再使用 Fixnum 和 Bignum 表示不同范围的数字,而是统一使用 Integer 表示整数

i = 2 ** 62 + 1
puts i.class

i = -2 ** 62
puts i.class

i = 10
puts i.class

执行上述代码,输出结果如下:

Integer
Integer
Integer

为了表示方法,在书写整数时,可以根据需要在数字之间任意加入下划线而不影响数字的值

i = 314_524_34200000
puts i
puts i.class

执行上述代码,输出结果如下:

31452434200000
Integer

Ruby 中的整数也支持其他进制的表示形式,在整数前添加 0b、0 和 0x 就可以表示二进制、八进制和十六进制。

整数的运算包括了:

  • + - * / %:加减乘除取模运算
  • ! & ^:按位与、按位或、按位异或运算
  • << >>:左移右移运算
  • <==> ==:比较大小,== 返回 true 或者 false,<==> 返回 1 -1 0
  • []:通过索引取值
puts 1==2 # false
puts 1<=>2 # -1

整数常用的方法有(Integer 类型的方法):

  • abs:返回绝对值
  • chr:返回数字所对应的 ASCII 编码的符号
  • times:循环整数次数的迭代方法,后面跟对代码块
  • downto:从大到小迭代
  • upto:从小到大进行迭代
  • to_s:将整数转变为字符串类型
puts -10.abs
puts 65.chr

puts "times 方法使用"
3.times{|i| puts i}

puts "downto 方法使用"
3.downto(1){|i| puts i}

puts "upto 方法使用"
1.upto(3){|i| puts i}

puts (1.to_s).class

执行上述代码,输出结果如下:

10
A
times 方法使用
0
1
2
downto 方法使用
3
2
1
upto 方法使用
1
2
3
String

浮点数

Ruby 中的小数有两种形式的表示方式,一种是普通的小数点表示,另一种是使用 E 科学计数法表示

a = 3.1415926
puts a.class

b = 31415926E-7
puts b
puts b.class

执行上述代码,输出结果如下:

Float
3.1415926
Float

浮点数的运算与整数的运算类似。浮点数既 Float 对象的常用方法如下:

ceil:返回比浮点数大的最小整数,向上取整 floor:返回比浮点数小的最大整数,向下取整 round:浮点数四舍五入到一个整数 to_i:直接去掉小数点后的位数,变为整数

puts 3.14.ceil
puts 3.14.floor
puts 3.56.round
puts 3.14.to_i
puts (3.14.to_i).class

执行上述代码,输出结果如下:

4
3
4
3
Integer

BigDecimal

Ruby 中 BigDecimal 可以提供任意精度的十进制数字,在使用 BigDecimal 之前要先引入 require bigdecimal

在用户余额变化等金额相关的计算时,为了避免丢失精度,一定要使用 BigDecimal,使用 BigDecimal 时一定要使用字符串作为参数,使用浮点数作为 BigDecimal 参数同样会造成精度丢失的问题

require 'bigdecimal'

puts 3 / 2
puts BigDecimal("3") / BigDecimal("2")
puts 1 + 20.2 + 400.03
puts BigDecimal("1") + BigDecimal("20.2") + BigDecimal("400.03")

执行上述代码,输出结果如下:

1
0.15e1
421.22999999999996
0.42123e3

二、Math 模块

Ruby 内置有一个 Math 模块,包含了常见的数学原酸的支持,Math 模块中有两个常量 Math::E 为自然对数的根 e 的值;Math::PI 为圆周率的值,可以使用 Math.constants 获取模块中的常量。

Math 模块中的常用的方法如下:

  • sin、cos、tan:分别对应计算正弦余弦和正切的函数值
  • asin、acos、atan:分别对应计算反正弦余弦和反正切的函数值
  • exp(x):返回 e**x
  • log(x),log10(x): 分别计以 e 和 10 为根的对数值
  • sqrt(x):返回 x 的非负平方根