toFixed方法的bug

更新时间:2023-07-26 19:41:44 阅读: 评论:0

toFixed⽅法的bug
最近在⼯作过程中碰到⼀个隐藏的bug,经调试发现竟然是toFixed函数不可靠的结果引起的。后端同学在处理价格⽐较的时候,⽤foFixed 进⾏价格的四舍五⼊之后,竟然发现⽐较的结果有问题;
⼤家都知道,Number类型的变量有个toFixed⽅法,该⽅法将Number四舍五⼊为指定⼩数位数的数字,以字符串返回。
IE:
0.6 .toFixed(0); // 0
1.6 .toFixed(0); // 2
Chrome:
0.6 .toFixed(0); // 1
1.6 .toFixed(0); // 2
另外还发现,就算是同在Chrome⾥,四舍五⼊也不靠谱:
( 0.035 ).toFixed( 2 ); // 0.04
慎始敬终( 0.045 ).toFixed( 2 ); // 0.04
这次IE倒是靠谱了:
( 0.035 ).toFixed( 2 ); // 0.04
( 0.045 ).toFixed( 2 ); // 0.05
结论:toFixed()函数靠不住,如果有需要精确控制的情况,还是⾃⼰写个⽅法⽐较好。⽐如:
function toFixed(number, decimal) {
气急败坏的近义词decimal = decimal || 0;
var s = String(number);
var decimalIndex = s.indexOf('.');
if (decimalIndex < 0) {
var fraction = '';
for (var i = 0; i < decimal; i++) {
fraction += '0';
}
return s + '.' + fraction;
}
var numDigits = s.length - 1 - decimalIndex;
if (numDigits <= decimal) {
var fraction = '';
for (var i = 0; i < decimal - numDigits; i++) {
fraction += '0';
}
return s + fraction;
}
var digits = s.split('');
var pos = decimalIndex + decimal;
var roundDigit = digits[pos + 1];
if (roundDigit > 4) {
//跳过⼩数点中国四大美女是哪四个
if (pos == decimalIndex) {
--pos;
}
简便计算digits[pos] = Number(digits[pos] || 0) + 1;
//循环进位
while (digits[pos] == 10) {
digits[pos] = 0;
--pos;
if (pos == decimalIndex) {备查账簿
--pos;
}
digits[pos] = Number(digits[pos] || 0) + 1;
}
}
霓虹灯制作/
/避免包含末尾的.符号
if (decimal == 0) {
decimal--;几乎造句
}
return digits.slice(0, decimalIndex + decimal + 1).join('');
}
var a = 19.02
var b = 209.01
// 结果
装扮的意思console.log(toFixed(a, 2)); //==> 19.02
console.log(toFixed(b, 2)); //==> 209.01
console.log(Number(toFixed(a, 2)) < Number(toFixed(b, 2))); //==> true

本文发布于:2023-07-26 19:41:44,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/89/1097768.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:价格   结果   发现   类型
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图