资讯专栏INFORMATION COLUMN

你不知道的取数值整数部分的冷知识

calx / 2747人阅读

摘要:我们可以用测一下具体实现原理,请参考文档注意因为操作将操作数转为,所以它不能处理超过位的数值取整,而有效整数的范围是位。综上所以如果要考虑压缩代码的大小,且明确知道数值范围不会超过位整数的时候,可以考虑使用取整。

在处理数值的时候,获取浮点数的整数和小数部分,是一种常见的操作,在JavaScript中有许多方法可以达到目的,但也正因为方法众多,所以哪种方法更好,也值得我们仔细研究一番。

1. parseInt
let num = 3.75;
console.log(parseInt(num)); // 3
num = -3.75;
console.log(parseInt(num)); // -3

parseInt(3.75),会先将3.75转换成字符串"3.75", 然后在转换成3.
这个方法是一个将字符串转换为整数的方法,如果参数不是一个字符串,则将其转换成字符串,性能开销大。
关键还有一个致命的问题:

console.log(parseInt(0.00000001));  // 1
console.log(parseInt(1000000000000000000000)); // 1

分析:
这是因为toString(),0.00000001.toString()===1e-8而1000000000000000000000..toString() === 1e+21。

2. Math.ceil + Math.floor Math.ceil() 向上取整 Math.floor() 向上取整
function trunc (num) {
    if (num>=0) {
        return Math.floor(num)
    } else {
        return Math.ceil(num)
    }
}
console.log(trunc(3.75));  // 3
console.log(trunc(-3.75)); // -3

使用Math.round和Math.ceil实现trunc方法,要比使用parseInt的性能好,因为省去了转字符串。我们可以用jsperf测一下:

3. Math.trunc()
console.log(Math.trunc(3.75));    // 3
console.log(Math.trunc(-3.75));   // -3
4. |

具体实现原理,请参考 ECMA-262文档

log(3.75 | 0);    // 3
console.log(-3.75 | 0);   // -3

注意:
因为bitwise操作将操作数转为Int32,所以它不能处理超过32位的数值取整,而JavaScript有效整数的范围是53位。

const num = 17179869184.89;
console.log(num | 0); // 0
console.log(Math.trunc(num)); // 17179869184

综上: 所以如果要考虑压缩代码的大小,且明确知道数值范围不会超过32位整数的时候,可以考虑使用 | 0取整。否则,还是使用Math方法吧。

附: 性能测试 https://jsperf.com

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/106304.html

相关文章

  • Python 基础篇 - Python入门

    摘要:除此之外的特定形式还有二进制序列类型,那么我们在这里所说的序列主要包含以下三种列表列表是一种可变序列,一般形式为,方括号内的各项间用逗号分隔。 引言 对于以前没有接触过任何编程语言的人来说,首先能明确编程的目的很重要,往往能明确一个目的,在日后的学习中遇到困难时心态就会轻松许多。当今计算机文化的多元化发展,涌现出了大数据、分布式计算、神经网络、机器学习等众多新概念,即便这样,任何意义上...

    VioletJack 评论0 收藏0
  • 你不知道的按位运算

    摘要:相信大家都知道二进制数按位运算的规则来看一些简单的例子单纯的二进制位之间的这些运算相当简单,但对我们实际编程并没有直接帮助,因为编程过程中需要的经常是数字间的运算,比如。 先来看LeetCode上的Divide Two Integers题目要求: Divide two integers without using multiplication, division and mod ope...

    luoyibu 评论0 收藏0
  • Python数值处理(一)

    摘要:取整使用函数可以轻松的对浮点数进行取整操作。这是因为函数在应对这种与两个整数距离相同的情况时,会取到最近的偶数上去。如果你特别需要精确的数值,那么可以使用模块。 round()取整 使用round()函数可以轻松的对浮点数进行取整操作。示例如下: >>> round(1.23, 1) 1.2 >>> round(1.27, 1) 1.3 >>> round(-0.36, 1) -0.4...

    isaced 评论0 收藏0
  • js数据结构-散列表(哈希表)

    摘要:散列表散列表,也叫哈希表,是根据键而直接访问在内存存储位置的数据结构。这个映射函数称做散列函数,存放记录的数组称做散列表。 散列表 散列表(Hash table,也叫哈希表),是根据键(Key)而直接访问在内存存储位置的数据结构。也就是说,它通过计算一个关于键值的函数,将所需查询的数据映射到表中一个位置来访问记录,这加快了查找速度。这个映射函数称做散列函数,存放记录的数组称做散列表。 ...

    call_me_R 评论0 收藏0
  • Java和Python中的整数除法,取余,舍入

    摘要:整数除法对两个不能整除的整数做除法,就要面对舍入的问题。中的舍入除了缺省的舍入方式,还有多种舍入可供选择。就是说,我们输入的十进制数,在计算机内部都是用二进制来表示的。 关于除法,你也许觉得没什么值得谈论的,毕竟小学的时候体育老师就教过我们了。然而对于编程中使用的除法,我觉得还是有很多值得注意的细节的。为什么我想深究一下?因为我日常主要使用Java和Python编程,而它们的除法在细节...

    hosition 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<