关于JavaScript中parseInt()的一个怪异行为解决

 更新时间:2022年12月05日 10:40:12   作者:Jimmy  
parseInt()是内置的 JS 函数,用于解析数字字符串中的整数,下面这篇文章主要给大家介绍了关于JavaScript中parseInt()的一个怪异行为解决,文中通过实例代码介绍的非常详细,需要的朋友可以参考下

parseInt() 是一个内置的 JavaScript 函数,它可以将数字字符串解析为整数。比如,我们将数字字符串 '100' 解析为整数:

const number = parseInt('100');
number; // 100

如预期那样,'100' 被解析为整数 100

parseInt(numericalString, radix) 也接受第二个参数:radix(基数),另一个参数是数字字符串 numericalStringradix 参数允许你解析来自不同数字基数的字符串为整数,基数通常有 2,8, 10 和 16

我们使用基数为 2parseInt() 来解析一个数字字符串:

const number = parseInt('100', 2);
number; // 4

parseInt('100', 2) 以基数 2 解析 '100' 为一个整数:所以它返回十进制数值 4

上面就是对 parseInt() 方法的简单介绍。

1. parseInt() 中的一个怪异行为

parseInt(numericalString) 总是将其第一个参数转换成字符串(如果它不是字符串的话),然后将这个字符串数字解析成整数。

这就是为什么你可以(但是不应这么做! )使用 parseInt() 来提取浮点数的整数部分:

parseInt(0.5); // => 0
parseInt(0.05); // => 0
parseInt(0.005); // => 0
parseInt(0.0005); // => 0
parseInt(0.00005); // => 0
parseInt(0.000005); // => 0

取出浮点数,比如 0.50.05 等等整数的部分。结果就是 0。这跟我们的预期结果一样。

那么提取 0.0000005 整数的部分会怎样呢?

parseInt(0.0000005); // => 5

parseInt() 将浮点数 0.0000005 解析为 5。这就很有趣且不符合预期...

为什么 parseInt(0.0000005) 会有如此怪异的行为呢?

2.解决 parseInt() 该怪异行为

我们回顾下,parseInt(numericalString) 对它的第一个参数做了什么:如果不是字符串,就将其转换为一个字符串,然后解析,之后返回解析的整数。

这可能是第一个线索。

我们手动将浮点数转换为字符串表现形式:

String(0.5); // => '0.5'
String(0.05); // => '0.05'
String(0.005); // => '0.005'
String(0.0005); // => '0.0005'
String(0.00005); // => '0.00005'
String(0.000005); // => '0.000005'
String(0.0000005); // => '5e-7'

String(0.0000005) 数值的显式转换和其它浮点数不同:它是指数符号exponential notation 字符串表现形式。

这是第二个线索 -- 很重要!

然后当指数符号字符串解析为整数,你就会得到整数 5

parseInt(0.0000005); // => 5
// same as
parseInt(5e-7); // => 5
// same as
parseInt('5e-7'); // => 5

parseInt('5e-7') 考虑第一个数字 '5',跳过了 'e-7'

解密了!因为 parseInt() 总是将它第一个参数转换为字符串,浮点数字小于 10−610^{-6}10−6 就会被写成指数符号的形式。parseInt() 从浮点数的指数符号中取出整数。

译者加 -- 注意,parseInt() 取字符串前面整数的部分,比如:parseInt('12Jimmy34') 则有返回结果 12

备注,安全地取出浮点数整数的部分,我推荐使用 Math.floor() 函数:

Math.floor(0.5); // => 0
Math.floor(0.05); // => 0
Math.floor(0.005); // => 0
Math.floor(0.0005); // => 0
Math.floor(0.00005); // => 0
Math.floor(0.000005); // => 0
Math.floor(0.0000005); // => 0

3. 总结

parseInt() 是个将数字字符串转换为整数的函数。

当你使用 parseInt() 获取浮点数的整数部分的时候,要小心。

小于 10−610^{-6}10−6 的浮点数(比如 0.0000005 等同于 5∗10−75 * 10^{-7}5∗10−7)被转换为以指数符号表示形式(比如 5e-70.0000005 指数符号形式)。这就是为什么使用 parseInt() 作用于如此小的浮点数会出现非预期效果:仅解析指数表示形式的重要部分(比如 5e-7 中的 5)。

挑战:你可以解释为什么 parseInt(999999999999999999999) 会等于 1

到此这篇关于JavaScript中parseInt()的一个怪异行为解决的文章就介绍到这了,更多相关js中parseInt()怪异行为内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

原文链接 Solving a Mystery Behavior of parseInt() in JavaScript -- 作者 Dmitri Pavlutin

相关文章

  • viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)

    viewer.js一个强大的基于jQuery的图像查看插件(支持旋转、缩放)

    这篇文章主要介绍了Viewer这一款强大的 jQuery 图像浏览插件,在信息详情页面实现点击图片可以预览,脚本之家也是用的这个js,这里为分享一下使用方法,需要的朋友可以参考下
    2020-04-04
  • Bootstrap每天必学之警告框插件

    Bootstrap每天必学之警告框插件

    Bootstrap每天必学之警告框插件,使用警告框(Alert)插件,您可以向所有的警告框消息添加可取消(dismiss)功能,感兴趣的小伙伴们可以参考一下
    2016-04-04
  • 如何用JS实现网页瀑布流布局

    如何用JS实现网页瀑布流布局

    这篇文章主要介绍了如何用JS实现网页瀑布流布局,帮助大家更好的利用JavaScript制作网页,感兴趣的朋友可以了解下
    2021-04-04
  • 详谈构造函数加括号与不加括号的区别

    详谈构造函数加括号与不加括号的区别

    下面小编就为大家带来一篇详谈构造函数加括号与不加括号的区别。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-10-10
  • 如何利用JavaScript编写一个格斗小游戏

    如何利用JavaScript编写一个格斗小游戏

    这篇文章主要给大家介绍了关于如何利用JavaScript编写一个格斗小游戏,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • uni-app小程序中父组件和子组件传值的实现实例

    uni-app小程序中父组件和子组件传值的实现实例

    uniapp父子组件引用传值,和vue的一样,没有小程序那样的麻烦,下面这篇文章主要给大家介绍了关于uni-app小程序中父组件和子组件传值的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-08-08
  • JavaScript canvas实现七彩时钟效果

    JavaScript canvas实现七彩时钟效果

    这篇文章主要为大家详细介绍了JavaScript canvas实现七彩时钟效果,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-05-05
  • js监听鼠标事件控制textarea输入字符串的个数

    js监听鼠标事件控制textarea输入字符串的个数

    一个js控制textarea输入字符串的个数的脚本,当鼠标按下抬起时判断输入字符数,很简单,但很实用
    2014-09-09
  • es7学习教程之Decorators(修饰器)详解

    es7学习教程之Decorators(修饰器)详解

    这篇文章主要给大家介绍了关于es7中Decorators(修饰器)的相关资料,文中通过示例代码给大家介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面跟着小编一起来学习学习吧。
    2017-07-07
  • JavaScript Math对象和调试程序的方法分析

    JavaScript Math对象和调试程序的方法分析

    这篇文章主要介绍了JavaScript Math对象和调试程序的方法,结合实例形式分析了javascript中Math对象生成随机数以及使用alert()、console.log()函数进行错误调试相关操作技巧,需要的朋友可以参考下
    2019-05-05

最新评论