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 rounds(翻译成圆整?取整?四舍五入?) toward negative infinity."IA32 的div命令不是向零取整吗?rub为什么要多此一举向负无穷rounds呢?这样有什么特别的意义吗?
答:没有什么特别的意义,在《Ruby Programming Language》3.1.3中说明了,与C相关的语言,如C,C++,Java是向零取整,Python,Tcl,Ruby是向负无穷取整。在x86指令中,SAR是向右取整的,IDIV是向零取整的。
好吧,原来就是这么平淡无奇的原因,以为会有什么好的发现,有些失望...
就这么着吧,伤心了呵呵~
创新互联www.cdcxhl.cn,专业提供香港、美国云服务器,动态BGP最优骨干路由自动选择,持续稳定高效的网络助力业务部署。公司持有工信部办法的idc、isp许可证, 机房独有T级流量清洗系统配攻击溯源,准确进行流量调度,确保服务器高可用性。佳节活动现已开启,新人活动云服务器买多久送多久。
本文名称:Ruby取模探险记-创新互联
当前URL:http://lswzjz.com/article/dsejoj.html