Js中parseFloat()方法所产生的精度问题

2021-11-08 11:21:32 浏览数 (2)

代码语言:javascript复制
<html>
<body>

<script type="text/javascript">
var a=0.1;
var b=0.4;
var c=0.2;
console.log(a b)
console.log(a c)
console.log(b c) 

</script>

</body>
</html>

JavaScript提供了3个显式的类型转换函数,分别是eval()、parseInt()和parseFloat()。 这是由于计算机里数字是以二进制存储的,大部分小数转换成二进制后会出现循环而不得不截断,于是精度就损失了。和parseFloat没多大关系。 比如你用js计算0.1 0.2肯定不会得出0.3的,而是带了个很长的尾巴。十进制0.1

代码语言:javascript复制
 => 二进制0.00011001100110011…(循环0011)     
 =>尾数为1.1001100110011001100…1100(共52位,除了小数点左边的1),指数为-4(二进制移码为00000000010),符号位为0    
 => 计算机存储为:0 00000000100 10011001100110011…11001    
 => 因为尾数最多52位,所以实际存储的值为0.00011001100110011001100110011001100110011001100110011001    
 而十进制0.2    
 => 二进制0.0011001100110011…(循环0011)    
 =>尾数为1.1001100110011001100…1100(共52位,除了小数点左边的1),指数为-3(二进制移码为00000000011),符号位为0    
 => 存储为:0 00000000011 10011001100110011…11001    
 因为尾数最多52位,所以实际存储的值为0.00110011001100110011001100110011001100110011001100110011    
 那么两者相加得:        
 0.00011001100110011001100110011001100110011001100110011001    
   0.00110011001100110011001100110011001100110011001100110011  
 =  0.01001100110011001100110011001100110011001100110011001100    
 转换成10进制之后得到:0.30000000000000004  

如果是计算金额,建立所有保存的数据都乖以100,如果想更大精度就乖1000,最终向用户展示的时候再除以对应的数就可以了。

0 人点赞