七台河做网站dede模板
七台河做网站,dede模板,ui设计最好的培训机构,asp三层架构做网站toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。例如将数据Num保留2位小数#xff0c;则表示为#xff1a;toFixed(Num)#xff1b;但是其四舍五入的规则与数学中的规则不同#xff0c;使用的是银行家舍入规则#xff0c;银行家舍入#xff1a;所谓银行家舍入… toFixed() 方法可把 Number 四舍五入为指定小数位数的数字。例如将数据Num保留2位小数则表示为toFixed(Num)但是其四舍五入的规则与数学中的规则不同使用的是银行家舍入规则银行家舍入所谓银行家舍入法其实质是一种四舍六入五取偶又称四舍六入五留双法。具体规则如下简单来说就是四舍六入五考虑五后非零就进一五后为零看奇偶五前为偶应舍去五前为奇要进一。
经测试发现在chorme下面并没有完全遵守这个规则尤其是5的后面没有数字的时候不是这么判断的如下
var b 1.335b.toFixed(2)1.33var b 1.345b.toFixed(2)1.34var b 1.355b.toFixed(2)1.35var b 1.365b.toFixed(2)1.36var b 1.375b.toFixed(2)1.38var b 1.385b.toFixed(2)1.39 可以发现在chorme下没有完全去遵循这个规律或许它有自己的算法但是毕竟它没有遵循通用的银行家算法所以tofixed这个方法在涉及到金钱计算的业务中还是少用.
总而言之不论引入toFixed解决浮点数计算精度缺失的问题也好它有没有使用银行家舍入法也罢都是为了解决精度的问题但是又离不开二进制浮点数的环境但至少他帮助我们找到了问题所在从而让我们有解决方法。 一开始的办法是把要四舍五入的后一位单独拎出来单独判断。
解决方法
通过重写toFixed方法
Number.prototype.toFixed function (n) {let result number.toString();const arr result.split(.);const integer arr[0];const decimal arr[1];result integer . decimal.substr(0, n);const last decimal.substr(n, 1); // 四舍五入转换为整数再处理避免浮点数精度的损失
if (parseInt(last, 10) 5) {const x Math.pow(10, n);result ((parseFloat(result) * x) 1) / x;result result.toFixed(n);}return result;} 然后又发现计算机二进制编码导致的精度问题详见上一篇博客。
自己debugger发现页面中的js进了死循环。很明显问题出在toFixed中回调了toFixed结果没有走出来继续debugger又有了惊人的发现。以下是控制台测试
console.log(2.115 * 100) // 211.50000000000003console.log(2.0115 * 1000) // 2011.4999999999998 既然你一直进入循环我就手动把你拉出来。
result (Math.round((parseFloat(result)) * x) 1) / x; 最终完整的重写toFixed的方法
// toFixed兼容方法Number.prototype.toFixed function (n) {if (n 20 || n 0) {throw new RangeError(toFixed() digits argument must be between 0 and 20);}const number this;if (isNaN(number) || number Math.pow(10, 21)) {return number.toString();}if (typeof (n) undefined || n 0) {return (Math.round(number)).toString();}let result number.toString();const arr result.split(.);// 整数的情况if (arr.length 2) {result .;for (let i 0; i n; i 1) {result 0;}return result;}const integer arr[0];const decimal arr[1];if (decimal.length n) {return result;}if (decimal.length n) {for (let i 0; i n - decimal.length; i 1) {result 0;}return result;}result integer . decimal.substr(0, n);const last decimal.substr(n, 1);// 四舍五入转换为整数再处理避免浮点数精度的损失if (parseInt(last, 10) 5) {const x Math.pow(10, n);result (Math.round((parseFloat(result) * x)) 1) / x;result result.toFixed(n);}return result;}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/87588.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!