【问题标题】:Number values changing when toString() applied应用 toString() 时数值发生变化
【发布时间】:2015-08-22 11:39:53
【问题描述】:

在测试我的一个检查数字有效性的函数时,我注意到一些非常奇怪的事情,我在测试“number.toString()[0]”时首先注意到了它。如果我在控制台登录 (fLetter(019272)); “0”始终显示“1”。
在线检查后,我找不到与对包含“0”的数字使用 toString() 方法相关的任何问题。

function numberValidate(number) {

        var numCheck = [0, 5, 7, 8, 9];
        var fLetter = number.toString()[0];

        if (number.match(/^\d{6}$/)) {
            for (var i = 0; i < 5; i++) {
                if (fLetter == numCheck[i]) {
                    return false;
                } else {
                    return true;
                }
            } 
        } 

    } 

我尝试在应用和不应用 toString() 方法的情况下检查其他一些测试变量,得到了一些我无法理解的结果。 **注意 - toString() 添加产生了相同的结果(在 JSfiddle 中执行)

var numTest = 00000000;
var numTest1 = 20203020;
var numTest2 = 011000110100;
var numTest3 = 01928;
var numTest4 = 012345;

console.log(numTest);     //Returned 0
console.log(numTest1);    //Returned 20203020
console.log(numTest2);    //Returned 1207996480
console.log(numTest3);    //Returned 1928
console.log(numTest4);    //Returned Returned 5349

谁能解释我为什么要返回这些值?谢谢

【问题讨论】:

  • 那么,真正的问题是什么?
  • here(阅读描述,上面写着«If radix is undefined(...)»
  • 谢谢你 - 我现在正在阅读它。

标签: javascript tostring number-formatting


【解决方案1】:

010 被视为八进制符号,因为前导 0,以及 0x10 将被视为十六进制符号。八进制数字系统使用数字 0 到 7。因此,019 给出 19,因为 9 不是八进制数字。这里有一些十进制数及其八进制表示法:

1  1 | 5  5 | 9  11 | 13 15
2  2 | 6  6 | 10 12 | 14 16
3  3 | 7  7 | 11 13 | 15 17
4  4 | 8 10 | 12 14 | 16 20

如您所见,由于我们只有 8 位可用(0、1、2、3、4、5、6、7),因此 8 变为 10,而 16 (8+8) 变为 20 (10+10) .为了让事情更清楚,让我们看看如何用 10 位(照常)计数,然后用 8 位计数。

使用 10 位数字:

0, 1, 2, 3, 4, 5, 6, 7, 8, 9, no more digits
nevermind, add 1 to the tenths and restart from 0
10, 11, 12, 13, 14, 15, 16, 17, 18, 19, no more digits
nevermind, add 1 to the tenths and restart from 0
20, 21, etc...

使用 8 位数字:

0, 1, 2, 3, 4, 5, 6, 7, no more digits
nevermind, add 1 to the "tenths" and restart from 0
10, 11, 12, 13, 14, 15, 16, 17, no more digits
nevermind, add 1 to the "tenths" and restart from 0
20, 21, etc...

这同样适用于二进制数:

   0,   1, no more digits
  10,  11, no more digits
 100, 101, no more digits
 110, 111, no more digits
1000, etc...

我们用十进制比较一下:

1    1 | 5  101 |  9 1001
2   10 | 6  110 | 10 1010
3   11 | 7  111
4  100 | 8 1000

相关资料:https://stackoverflow.com/a/32107058/1636522 :-)

【讨论】:

    【解决方案2】:

    Number 是数字的 64 位浮点表示。它不将数字保存为字符数组,因此前导零不可用。 String 包含一个字符数组,因此前导 0 不会丢失

    如果可能的话,JavaScript 允许透明类型转换,因此字符串“0111”== 到数字 111。因此,如果您编写代码 "0111" == 111,它将返回 true。

    Javascript 提供了两个相等运算符 == 和严格相等 === 第二个要求双方是相同的类型,因此 Number(111) === String("111") 将返回 false,因为它们不是相同的类型。这同样适用于不等式运算符!= and !==

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多