zoukankan      html  css  js  c++  java
  • Js中parseInt()的怪异行为

    parseInt()是内置的 js 函数,用于解析数字字符串中的整数。 例如,解析数字字符串'100':

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

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

    parseInt(numericalString, radix)还接受第二个参数:从 2 到 36,表示字符串的基数。例如指定 16 表示被解析值是十六进制数。请注意,10 不是默认值,最常见的是 2、8、10 和 16。

    例如我们使用 parseInt 以二进制方式解析数字字符串:

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

    100 对应的二进制数是 4,所以返回 4。

    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.5、0.05等,结果为0, 这和预期的一样。

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

    parseInt(0.0000005); // => 5

    parseInt() 将浮点数 0.0000005 解析为 5。为什么 parseInt(0.0000005) 有这样一个怪异的行为?

    https://www.98891.com/article-100-1.html

    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)字符串的行为与其他浮点数不同:它的表示方式是用指数的形式。

    这是第二个重要的线索!

    当指数符号被解析为整数时,我们会得到数字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负6次方的浮点数将以指数表示。 然后 parseInt() 从 float 的指数表示法中提取整数。

    另外,为了安全地提取浮点数的整数部分,建议使用 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的-6次方 (例如0.0000005,也就是5*10-7)的浮点数转换成字符串时被写成指数表示法(例如5e-7是0.0000005的指数表示法)。这就是为什么在 parseInt() 中使用这么小的浮点数会导致意想不到的结果:只有指数表记的重要部分(例如 5e-7 中的 5)会被解析。

    那么现在大家可以试着解释为什么 parseInt(999999999999999999999)等于1?

  • 相关阅读:
    Hadoop集群(三) Hbase搭建
    Hadoop集群(二) HDFS搭建
    Hadoop集群(一) Zookeeper搭建
    Redis Cluster 添加/删除 完整折腾步骤
    Redis Cluster在线迁移
    Hadoop分布式HA的安装部署
    Describe the difference between repeater, bridge and router.
    what is the “handover” and "soft handover" in mobile communication system?
    The main roles of LTE eNodeB.
    The architecture of LTE network.
  • 原文地址:https://www.cnblogs.com/xiaonian8/p/14934060.html
Copyright © 2011-2022 走看看