We read every piece of feedback, and take your input very seriously.
To see all available qualifiers, see our documentation.
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Math.floor
~~
众所周知 Math.floor 的作用是去除小数字后的数字
但还有一种奇淫技巧,使用 ~~ 两次取反操作,也能达到同样的效果,原理之前讲过,就不再赘述了。
很多人都认为 ~~ 可以取代 Math.floor ,包括我,直到今天,我才发现我错了。
事情是这样的,我用 ~~ 来操作一个正数,结果,这个正数竟然惊人得变成了负数。
经过排查,才发现是使用了 ~~ ,~是一个位操作,js的位操作最大只能操作 32位。
~
但是因为某些不可抗拒因素,我要操作的数字非常大 (打工人的悲哀啊)
导致把这个正数转成负数了,没错,~~ 居然翻车了!我用得特别顺手的 取反再取反 操作翻车了!!! 。
老实改回 Math.floor ,变成负数的问题马上解决。
所以,以后用 ~~ 这样的骚操作还是留点心眼,万一某天加了需求,要操作的数突然变成天文数字,那就翻车了。
至于多大的数才能用位操作呢?
大概是负20亿 到 正20亿这个区间。(32位,一个存符号位,剩下的31位存数字。)
试试这几行代码?加深一下印象?
1 << 31 // 1移到符号位,变负数 1 << 32 // js的位移动是循环的,回到原点 ~~2e9 // 正常 ~~3e9 // 溢出,变负数
The text was updated successfully, but these errors were encountered:
以上讨论建立下操作的数字为正数情况,负数应使用 Math.ceil
Math.ceil
或者直接使用 es6 的新增方法:Math.trunc
Sorry, something went wrong.
No branches or pull requests
众所周知
Math.floor
的作用是去除小数字后的数字但还有一种奇淫技巧,使用
~~
两次取反操作,也能达到同样的效果,原理之前讲过,就不再赘述了。很多人都认为
~~
可以取代Math.floor
,包括我,直到今天,我才发现我错了。事情是这样的,我用
~~
来操作一个正数,结果,这个正数竟然惊人得变成了负数。经过排查,才发现是使用了
~~
,~
是一个位操作,js的位操作最大只能操作 32位。但是因为某些不可抗拒因素,我要操作的数字非常大 (打工人的悲哀啊)
导致把这个正数转成负数了,没错,
~~
居然翻车了!我用得特别顺手的 取反再取反 操作翻车了!!! 。老实改回
Math.floor
,变成负数的问题马上解决。所以,以后用
~~
这样的骚操作还是留点心眼,万一某天加了需求,要操作的数突然变成天文数字,那就翻车了。至于多大的数才能用位操作呢?
大概是负20亿 到 正20亿这个区间。(32位,一个存符号位,剩下的31位存数字。)
试试这几行代码?加深一下印象?
The text was updated successfully, but these errors were encountered: