JavaScript中toFixed(6)保留6位小数失效问题排查
问题原因
你的代码有两个核心错误,导致没有得到预期的6位小数结果:
- 运算符优先级错误:成员访问符
.的运算优先级高于除法/,你写的positive_count/array.length.toFixed(6)实际执行逻辑是先给array.length(值为5)调用toFixed(6)得到字符串"5.000000",做除法时JS自动把这个字符串转回数字5,等价于直接计算positive_count / 5,根本没有对最终的占比结果做小数位格式化。 toFixed()方法不会修改原变量,它执行后会返回一个格式化后的新字符串,你写了calculatePos.toFixed(6)但没有接收返回值,这行代码等于没有生效。
额外注意:你把正、负、零的计数变量定义在了全局作用域,如果多次调用plusMinus函数,计数会持续累加,得到错误的统计结果。
修正后可运行代码
const array = [1, 1, 0, -1, -1]; function plusMinus(arr) { // 计数变量移到函数内部,避免全局污染和多次调用计数累加问题 let positive_count = 0; let negative_count = 0; let zero_count = 0; const arrLen = arr.length; for(let i = 0; i < arrLen; i++) { if(arr[i] > 0) { positive_count++; } else if (arr[i] < 0) { negative_count++; } else { zero_count++; } } // 用括号明确优先级:先算除法得到占比,再对结果格式化保留6位小数 const calculatePos = (positive_count / arrLen).toFixed(6); console.log(calculatePos); const calculateNeg = (negative_count / arrLen).toFixed(6); console.log(calculateNeg); const calculateZero = (zero_count / arrLen).toFixed(6); console.log(calculateZero); } plusMinus(array);
运行输出
0.400000 0.400000 0.200000
补充说明
- 不确定运算符优先级的时候,直接加括号明确执行顺序,能避免大部分预期外的运算结果
toFixed()的返回值是字符串类型,如果格式化后还需要做数值运算,记得用Number()转回数字类型;如果只是打印输出,直接使用返回的字符串即可- 变量尽量定义在最小作用域内,不要随意挂载到全局,避免隐性bug
内容的提问来源于stack exchange,提问作者mustyg123
相关产品推荐
相关产品推荐

