Ruby中对数值运算的支持

测试和学习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自动管理。

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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值