Ruby取模探险记

Ruby 的负数除法为什么要向负无穷取整呢?

创新互联网站建设公司是一家服务多年做网站建设策划设计制作的公司,为广大用户提供了成都做网站、网站设计、外贸营销网站建设,成都网站设计,广告投放平台,成都做网站选创新互联,贴合企业需求,高性价比,满足客户不同层次的需求一站式服务欢迎致电。

今天学习Ruby的过程中遇到一个问题:

puts (5 % 3)  # prints 2
puts (-5 % 3) # prints 1
puts (5 % -3) # prints -1
puts (-5 % -3)# prints -2

看了半天表示没有找到什么好的规律...

于是搜之,翻到了整数除法定义:

class Float 
    def to_s  
        format("%.4f", self)  
    end 
end 
 
class Fixnum 
    def / (num)  
        self.to_f/num.to_f  
    end 
end

感觉ruby定义的真是干净利落!貌似只要是懂英语的都能看懂呵呵~

先转成浮点,然后除之。

那么-5%3怎么就等于-1了呢?

有公式a%b = a - (a/b * b).于是乎,应该先求出来-5/3。根据上面公式知道-5/3会利用小数除法,即-5/3 = -1.6666666...那该怎么去小数部分呢?起初我以为是按照取绝对值,然后四舍五入,那么-1.6666666...应该是-2,没错,对于这个除法结果是正确的。

但是,对于-4%3呢?

按照取绝对值,然后四舍五入来算,那么-4/3 = -1.33333...那么,应该得到-1,于是乎,模应该是-1;不过,大家都懂得,既然都写到这了,怎么着这个值也不能再等于-1了吧。呵呵,你猜的没错,(-4/3 == -2)这个表达式是true。

What's the fuck???!!!

我-4怎么能和-5一样???我-4的那个1呢!!!我-4竟然和“欧巴”-5一样大Ruby取模探险记这让我以后再数字界怎么混@_@

好了,言归正传,为什么会这样,又搜了搜,发现下面的一些注解:

问:"Ruby rounds(翻译成圆整?取整?四舍五入?) toward negative infinity."IA32 的div命令不是向零取整吗?rub为什么要多此一举向负无穷rounds呢?这样有什么特别的意义吗?

答:没有什么特别的意义,在《Ruby Programming Language》3.1.3中说明了,与C相关的语言,如C,C++,Java是向零取整,Python,Tcl,Ruby是向负无穷取整。在x86指令中,SAR是向右取整的,IDIV是向零取整的。

好吧,原来就是这么平淡无奇的原因,以为会有什么好的发现,有些失望...

就这么着吧,伤心了呵呵~


网页题目:Ruby取模探险记
URL标题:http://myzitong.com/article/ijijgd.html