JavaScript编号.toFixed(2),不';I don’我没料到。这是虫子吗?

JavaScript编号.toFixed(2),不';I don’我没料到。这是虫子吗?,javascript,rounding,rounding-error,tofixed,Javascript,Rounding,Rounding Error,Tofixed,我正在编写一个需要一些舍入和数字格式的代码,在编写单元测试时,我遇到了这种奇怪的情况。有时Number.toFixed()未按预期舍入。进一步调查显示,舍入逻辑在数字64处发生变化。下面是我运行的一个示例 财务职能(x){ 返回编号.parseFloat(x).toFixed(2); } console.log(财务(123.456)); //预期产出:“123.46” 控制台日志(财务(0.004)); //预期产出:“0.00” 控制台日志(财务(0.005)); //预期产出:“0.01”

我正在编写一个需要一些舍入和数字格式的代码,在编写单元测试时,我遇到了这种奇怪的情况。有时Number.toFixed()未按预期舍入。进一步调查显示,舍入逻辑在数字64处发生变化。下面是我运行的一个示例

财务职能(x){
返回编号.parseFloat(x).toFixed(2);
}
console.log(财务(123.456));
//预期产出:“123.46”
控制台日志(财务(0.004));
//预期产出:“0.00”
控制台日志(财务(0.005));
//预期产出:“0.01”
控制台日志(财务(10.005));
//预期产出:“10.01”
控制台日志(财务(63.005));

//预期输出:“63.01”如果您想使用数字赚钱,请使用其他库。这是几乎所有编程语言的通用建议-不要使用本机浮点原语,使用BigDecimal(Java)或类似的东西,即使没有内置的库也可以。许多标记为重复的问题也没有很好的答案,但VLAZ说到点子上了。。根据设计,使用浮点数进行舍入是不可靠的。这个问题也会蔓延到其他类型的计算中,如果你想精确的话,最好避免浮动。我为js编写了一个lib来处理这个问题:需要一个全新的浏览器。原因与为什么
0.1+0.2!==0.3
如果您想用数字赚钱,请使用其他库。这是几乎所有编程语言的通用建议-不要使用本机浮点原语,使用BigDecimal(Java)或类似的东西,即使没有内置的库也可以。许多标记为重复的问题也没有很好的答案,但VLAZ说到点子上了。。根据设计,使用浮点数进行舍入是不可靠的。这个问题也会蔓延到其他类型的计算中,如果你想精确的话,最好避免浮动。我为js编写了一个lib来处理这个问题:需要一个全新的浏览器。原因与为什么
0.1+0.2!==0.3
function financial(x) {
  return Number.parseFloat(x).toFixed(2);
}

console.log(financial(123.456));
// expected output: "123.46"

console.log(financial(0.004));
// expected output: "0.00"

console.log(financial(0.005));
// expected output: "0.01"

console.log(financial(10.005));
// expected output: "10.01"

console.log(financial(63.005));
// expected output: "63.01" <<== This is still OK.

console.log(financial(64.005));
// expected output: "64.01" <<== THIS RETURNS 64.00, NOT 64.01. WHY?

console.log(financial(100.005));
// expected output: "100.01"  <<== THIS RETURNS 100.00, NOT 100.01. WHY?

console.log(financial(64.006));
// expected output: "64.01"  <<== This is OK as well

console.log(financial(64.015));
// expected output: "64.02"  <<== This is OK as well

console.log(financial(64.105));
// expected output: "64.11"  <<== This is OK as well

console.log(financial('1.23e+5'));
// expected output: "123000.00"