toFixed()*100保留的小数位数和预想的不一致

目录

一、问题

 二、原因及解决方法

三、总结


一、问题

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-1

 二、原因及解决方法

1.不应该呀,怎么会这么离谱呢?

   先保留4位小数,然后再扩大100倍,不就是小数点右移2位吗?怎么有时候位数竟然 远远大于2呢??????

2.直接进行运算发现,有时候也会有这种问题,如图2-1所示

图2-1

 3.突然意识到应该是 和计算机的计算的精度有关系。计算机中采用二进制进行计算(计算机能够保留、存储和计算的位数是有限制的,现在一般都是64位,对于一些无限小数,计算机无法准确的表示),所以和十进制的计算结果存在差异,最终导致了在十进制中正确的东西,用二进制计算时有问题的情况。

4.解决方法:对最终的计算结果使用 .toFixed(),就能确保保留的小数位数是准确的。toFixed就是用来专门处理float数据保留的小数位数的。

三、总结

1.之前一直听老师在讲台说:浮点溢出。只是知道有这么回事,但是没有举例,也没有实际遇到过,现在算是 温故而知新了。

2.计算机中的运算要确保运算结果和预期一致,使用的方法一定要精准。最好不要把十进制的逻辑代入到代码中,因为二进制计算和十进制计算在精度方面是有区别的。

/*

希望对你有帮助!

如有错误,欢迎指正,非常感谢!

*/ 

猜你喜欢

转载自blog.csdn.net/qq_45327886/article/details/130265391
今日推荐