2

为什么当我想将格式化数字分配给变量时它显示错误?

var jsObject = new Object();
jsObject.number = 0;
for (i = 1; i <= 10; i++) {
  jsObject.number += 0.1;
  console.log((jsObject.number).toFixed(1)); // works and shows right numbers
  jsObject.number = (jsObject.number).toFixed(1); // TypeError: jsObject.number.toFixed is not a function
}

4

5 回答 5

4

因为.toFixed()重新调整了一个字符串,所以你用字符串替换了数字。简单的日志记录会告诉你发生了什么。

var jsObject = new Object();

jsObject.number = 0;

for(i = 1; i <= 10; i++) {

    jsObject.number += 0.1;
    console.log(i, "before", jsObject.number, typeof jsObject.number)
    jsObject.number = (jsObject.number).toFixed(1);            
    console.log(i, "after", jsObject.number, typeof jsObject.number)


}

输出将是:

1 before 0.1 number
1 after 0.1 string
2 before 0.10.1 string
"Uncaught TypeError: jsObject.number.toFixed is not a function",

JavaScript 不包含尾随零。因此,如果您需要它们进行输出,最好在输出数字的地方进行。或者唯一的其他选择是在添加之前对其进行 parseFloat Number 解析。

jsObject.number = Number(jsObject.number) + 0.1;
jsObject.number = parseFloat(jsObject.number) + 0.1;
于 2018-09-10T13:26:31.703 回答
0

toFixed返回一个字符串,而字符串没有toFixed方法。像这样更新你的for循环来解决这个问题。

for (i = 1; i < 10; i++) {
    jsObject.number += 0.1;
    console.log((jsObject.number).toFixed(1));
    jsObject.number = parseFloat((jsObject.number).toFixed(1)); // <--
}
于 2018-09-10T13:26:47.777 回答
0

此方法返回一个字符串。

https://www.geeksforgeeks.org/javascript-tofixed-function/

返回值:它以字符串表示形式返回一个数字。

所以第一次它有效,但随后它失败了,不再是一个数字。

您可以解析为数字,或强制转换为数字(例如使用乘法):

for(i = 1; i <= 10; i++) {

    jsObject.number += 0.1;

    console.log( (jsObject.number).toFixed(1) ); // works and shows right numbers

    jsObject.number = 1 * (jsObject.number).toFixed(1); // TypeError: jsObject.number.toFixed is not a 
} 
于 2018-09-10T13:27:15.597 回答
0

如评论中所述,您正在用它的字符串表示覆盖数字(toFixed执行此操作)。因此,您必须将字符串重新转换为数字格式。有很多方法可以正确与否,我更喜欢除以 1(或乘)

var jsObject = new Object();
jsObject.number = 0;
for (i = 1; i <= 10; i++) {
  jsObject.number += 0.1;
  console.log((jsObject.number).toFixed(1)); // works and shows right numbers
  jsObject.number = (jsObject.number).toFixed(1) / 1; // TypeError: jsObject.number.toFixed is not a function
}

于 2018-09-10T13:28:42.647 回答
0

您需要将string返回的 fromtoFixed()转换为正确的数据类型。

toFixed()在第二次迭代中返回 a stringso,它试图调用string.toFixed(),因为toFixed()is 不存在所以不存在 for strings

var jsObject = new Object();
jsObject.number = 0;

for(i = 1; i <= 10; i++) {
    jsObject.number += 0.1;
    console.log( jsObject.number.toFixed(1) );
    jsObject.number = Number.parseFloat(jsObject.number.toFixed(1)); 
}

于 2018-09-10T13:29:14.433 回答