目录
一、问题
二、原因及解决方法
三、总结
一、问题
1.因为演示需要,要造一些假数据,一些数据要求保留2位小数。这需求真的不难,不就是parseFloat().toFixed()不就完了。
2.所以很快就写了如下代码:
let a=Math.random()*(12-1)+1;
let b=12;
let random1=parseFloat(a/b).toFixed(4)*100;
let random2=parseFloat(a/b*100).toFixed(2);
let random3=(parseFloat(a/b)*100).toFixed(2);
console.log("random",random1,random2,random3);
3.问题:random1竟然有时候有很多位小数,还是偶现的,就离谱,如图1-1所示。
二、原因及解决方法
1.不应该呀,怎么会这么离谱呢?
先保留4位小数,然后再扩大100倍,不就是小数点右移2位吗?怎么有时候位数竟然 远远大于2呢??????
2.直接进行运算发现,有时候也会有这种问题,如图2-1所示
3.突然意识到应该是 和计算机的计算的精度有关系。计算机中采用二进制进行计算(计算机能够保留、存储和计算的位数是有限制的,现在一般都是64位,对于一些无限小数,计算机无法准确的表示),所以和十进制的计算结果存在差异,最终导致了在十进制中正确的东西,用二进制计算时有问题的情况。
4.解决方法:对最终的计算结果使用 .toFixed(),就能确保保留的小数位数是准确的。toFixed就是用来专门处理float数据保留的小数位数的。
三、总结
1.之前一直听老师在讲台说:浮点溢出。只是知道有这么回事,但是没有举例,也没有实际遇到过,现在算是 温故而知新了。
2.计算机中的运算要确保运算结果和预期一致,使用的方法一定要精准。最好不要把十进制的逻辑代入到代码中,因为二进制计算和十进制计算在精度方面是有区别的。
/*
希望对你有帮助!
如有错误,欢迎指正,非常感谢!
*/