温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

Ruby取模探险记

发布时间:2020-05-30 22:30:01 来源:网络 阅读:1417 作者:melon_tony 栏目:编程语言

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是向零取整的。

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

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

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI