Skip to content
New issue

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~~ 的区别 #51

Open
coppyC opened this issue Nov 12, 2020 · 1 comment
Open

Math.floor~~ 的区别 #51

coppyC opened this issue Nov 12, 2020 · 1 comment
Labels

Comments

@coppyC
Copy link
Owner

coppyC commented Nov 12, 2020

众所周知 Math.floor 的作用是去除小数字后的数字

但还有一种奇淫技巧,使用 ~~ 两次取反操作,也能达到同样的效果,原理之前讲过,就不再赘述了。

很多人都认为 ~~ 可以取代 Math.floor ,包括我,直到今天,我才发现我错了。

事情是这样的,我用 ~~ 来操作一个正数,结果,这个正数竟然惊人得变成了负数。

经过排查,才发现是使用了 ~~~是一个位操作,js的位操作最大只能操作 32位。

但是因为某些不可抗拒因素,我要操作的数字非常大 (打工人的悲哀啊)

导致把这个正数转成负数了,没错,~~ 居然翻车了!我用得特别顺手的 取反再取反 操作翻车了!!! 。

老实改回 Math.floor ,变成负数的问题马上解决。

所以,以后用 ~~ 这样的骚操作还是留点心眼,万一某天加了需求,要操作的数突然变成天文数字,那就翻车了。

至于多大的数才能用位操作呢?

大概是负20亿 到 正20亿这个区间。(32位,一个存符号位,剩下的31位存数字。)

试试这几行代码?加深一下印象?

1 << 31 // 1移到符号位,变负数
1 << 32  // js的位移动是循环的,回到原点
~~2e9  // 正常
~~3e9  // 溢出,变负数
@coppyC coppyC added the js label Nov 12, 2020
@coppyC
Copy link
Owner Author

coppyC commented Nov 13, 2020

以上讨论建立下操作的数字为正数情况,负数应使用 Math.ceil

或者直接使用 es6 的新增方法:Math.trunc

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
Projects
None yet
Development

No branches or pull requests

1 participant