标签:四舍五入 multi 浮点数 JS 精度 toFixed Math zhyib
需求是遇到一个需要保留两位小数,但是出现了预期之外的结果
(15.845).toFixed(2); // 15.85
(16.845).toFixed(2); // 16.84
显然是不符合四舍五入规则的,最后的原因在官方文档中已写明,而且根本不是特殊的四舍五入规则的原因。
官方文档
Number.prototype.toFixed() - JavaScript | MDN (mozilla.org)
Warning: 浮点数不能精确地用二进制表示所有小数。这可能会导致意外的结果,例如
0.1 + 0.2 === 0.3
返回false
.
所以问题就是出在浮点数的精度问题。由于浮点数表示法导致在四舍五入运算上出现了问题
合理的算法
function toFixedNew(num, dig) {
const multi = Math.pow(10, dig);
return Math.round(num * multi) / multi;
}
比较简单的写法,没有考虑 undefined
, NaN
之类的情况,
因为 Math.round()
是严格按照 0.5 进行取舍。
ECMAScript 2015 Language Specification – ECMA-262 6th Edition (ecma-international.org)
ESMA 6 标 中的 toFixed,有点复杂
欢迎来我的博客做客
zhyib.gitee.io
zhyib.github.io
标签:四舍五入,multi,浮点数,JS,精度,toFixed,Math,zhyib 来源: https://blog.csdn.net/zhyib002/article/details/120762144
本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享; 2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关; 3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关; 4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除; 5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。