测试和学习Ruby中Numeric的通用方法。主要测试:Integer 和 Float
Q:ruby中是如何实现对numbers的支持的呢?
A:在ruby中“Everything is an Object”,ruby内置了一些Classes 实现了numbers。[img]http://dl.iteye.com/upload/picture/pic/94792/68e61f28-ad7c-38fc-ba1d-92831a8413a9.png[/img]
在ruby中不需要明确的指定类型,ruby自动管理。
Q:ruby中是如何实现对numbers的支持的呢?
A:在ruby中“Everything is an Object”,ruby内置了一些Classes 实现了numbers。[img]http://dl.iteye.com/upload/picture/pic/94792/68e61f28-ad7c-38fc-ba1d-92831a8413a9.png[/img]
在ruby中不需要明确的指定类型,ruby自动管理。
int_num = 9999
puts "int_num = 9999 => int_num.class: #{int_num.class}" # Fixnum
float_num = 9999.9
puts "float_num = 9999.9 => float_num.class: #{float_num.class}" #Float
int_num = 9999 * 999999999999
puts "int_num = 9999 * 9999999999 => int_num.class: #{int_num.class}" #Bignum
test_num = int_num * float_num
puts "test_num = int_num * float_num => test_num.class : #{test_num.class}" #Float
#Numeric
#abs
puts "(-5).abs: #{(-5).abs} " #5
#abs2
puts "(-5).abs2: #{(-5).abs2}" #25
#ceil (returnValue >= num)
puts "(5.3).ceil: #{(5.3).ceil}" #6
puts "(5).ceil: #{(5).ceil}" #5
puts "(-5.3).ceil: #{(-5.3).ceil}" # -5
#floor (returnValue <= num)
puts "(5.3).floor: #{(5.3).floor}" #5
puts "(5).floor: #{(5).floor}" #5
puts "(-5.3).floor: #{(-5.3).floor}" # -6
#coerce(numeric) -> Array
puts "5.coerce(5.5) => #{5.coerce(5.5)}" #[5.5,5.0] ==> [param, receiver]
puts "5.5.coerce(5) => #{5.5.coerce(5)}" #[5.0, 5.5]
puts "6.coerce(3) => #{6.coerce(3)}" #[3, 6]
#延伸问题:ruby中的数值之间的转换是如何做到呢?
#div /
puts "5 / 2 => #{5 / 2}" # 2
puts "5 div 2 => #{5.div 2}" # 2
puts "5.0 / 2 => #{5.0 / 2}" # 2.5
puts "-5.0 / 2 => #{-5.0 / 2}" # -2.5
puts "5.0 / -2 => #{5.0 / -2}" # -2.5
puts "-5.0 / -2 => #{5.0 / 2}" # 2.5
#fdiv
puts "5.fdiv 2 => #{5.fdiv 2}" #2.5
puts "-5.fdiv 2 => #{-5.fdiv 2}" # -2.5
puts "5.0.fdiv 2 => #{5.0.fdiv 2}" # 2.5
puts "10.fdiv 3 => #{10.fdiv 3}" #3.3333333333333335
#integer?
puts "5.integer? =>#{5.integer?}" # true
puts "5.0.integer? => #{5.0.integer?}" #false
#nonzero?
puts "5.nonzero? => #{5.nonzero?}" #5
puts "0.nonzero? => #{0.nonzero?}" #nil
#zero?
puts "zero?"
puts "1.zero? => #{1.zero?}" #false
puts "0.zero? => #{0.zero?}" #true
#quo
puts "5.quo 2 => #{5.quo 2}" #5/2
puts "2.quo 5 => #{2.quo 5}" #2/5
#divmod
puts "divmod:"
puts "5.divmod 2 => #{5.divmod 2}" #[2, 1]
puts "5.0.divmod 2 => #{5.0.divmod 2 }" # [2, 1.0]
puts "-5.0.divmod 2 => #{-5.0.divmod 2 }" # [-3, 1.0]
puts "5.0.divmod -2 => #{5.0.divmod -2 }" # [-3, -1.0]
puts "-5.0.divmod -2 => #{-5.0.divmod -2 }" # [-2, -1.0]
#modulo
puts "modulo:"
puts "5.modulo 2 => #{5.modulo 2}" # 1
puts "5.modulo 2.0 => #{5.modulo 2.0}" # 1.0
puts "5.0.modulo 2 => #{5.0.modulo 2}" # 1.0
puts "5.0.modulo 2.0 => #{5.0.modulo 2.0}" # 1.0
puts "5.modulo -2 => #{5.modulo -2}" # -1
puts "-5.modulo 2 => #{-5.modulo 2}" # 1
puts "-5.modulo -2 => #{-5.modulo -2}" # -1
#remainder
puts "remainder:"
puts "5.remainder 2 => #{5.remainder 2}" #1
puts "-5.remainder 2 => #{-5.remainder 2}" #-1
puts "5.remainder -2 => #{5.remainder -2}" #1
puts "-5.remainder -2 => #{-5.remainder -2}" #-1
#step => num.step(end_num, step){|i| block} -> num
puts "step:"
1.step(10,2){|i| print i, " "} #1 3 5 7 9
1.step(-10,-2){|i| print i, " "}#-1 -3 -5 -7 -9
# encoding: utf-8
#Integer
#even?
puts "Fixnum = > even?"
puts "3.even? => #{3.even?}" #false
puts "0.even? => #{0.even?}" #true
puts "4.even? => #{4.even?}" #true
puts "-4.even? => #{-4.even?}" # true
#odd?
puts "Fixnum = > odd?"
puts "3.odd? => #{3.odd?}" #true
puts "0.odd? => #{0.odd?}" #false
puts "4.odd? => #{4.odd?}" #false
puts "-3.odd? => #{-4.odd?}" # false
#size
puts "(fix.size -> int) Returns the number of bytes in the machine representation of a Fixnum."
puts "0.size => #{0.size}" #4
puts "9999.size => #{9999.size}" #4
#succ
puts "fix.succ->int succ = succ + 1"
puts "5.succ = > #{5.succ}" #6
#to_f
puts "to_f"
puts "5.to_f = > #{5.to_f}" #5.0
#to_s
puts "to_s base 2-36"
puts "35.to_s => #{35.to_s}" #35 默認10進制
puts "35.to_s(2) => #{35.to_s(2)}" #100011 二進制
puts "35.to_s(8) => #{35.to_s(8)}" #43 八進制
puts "35.to_s(10) => #{35.to_s(10)}" #35
puts "35.to_s(16) => #{35.to_s(16)}" #23
#float
puts "float"
puts "Float::MIN => #{Float::MIN}" #當前系統所支持的最小雙精度的浮點數
puts "Float::MAX => #{Float::MAX}" #當前系統所支持的最大雙精度的浮點數
#finite? flt.finite? -> true or false
puts "1.0.finite? => #{1.0.finite?}" #true
puts "(1.0/0).finite? => #{(1.0/0).finite?}" #false
#flt.infinite? -> nil or -1 or 1
puts "infinite?"
puts "1.0.infinite? => #{(1.0).infinite?}" #
puts "(1.0/0).infinite? => #{(1.0 / 0).infinite?}" #1
puts "(-1.0 / 0).infinite? = > #{(-1.0 / 0).infinite?}" #-1
#flt.nan? -> true or flase
#Returns true if flt is an invalid IEEE floating-point number
puts "nan?"
puts "1.0.nan? => #{(1.0).nan?}" #false
puts "0.0.nan? => #{0.0.nan?}" #false
puts "(1.0 / 0.0).nan? => #{(1.0 / 0.0).nan?}" # false (1.0 / 0.0) => Infinity ()
puts "(0.0/0.0).nan? => #{(0.0 / 0.0).nan?}" #true (0.0 / 0.0)=>NaN
#round
puts "round"
puts "1.5.round = > #{1.5.round}" #2
puts "1.4.round = > #{1.4.round}" #1
puts "1.45.round => #{1.45.round}" #1
puts "1.445.round(2) => #{1.445.round(2)}" #1.45
puts "1.4445.round(2)=> #{1.4445.round(2)}" #1.44
#to_i, to_int, truncate
puts "to_i, to_int"
puts "1.9.to_i => #{1.9.to_i}" #1
puts "1.1.to_int => #{1.1.to_int}" #1
puts "1.9.truncate => #{1.9.truncate}" #1