• 首页
  • 电影
  • Js
  • 前端
  • 新旅
  • 奇技
  • 网安
  • 歌单
  • 关于
  • 搜索
  • 夜间模式
    ©2013-2025  成长小破站 Theme by OneBlog
    搜索
    标签
    # css # js # uniapp # ps # chrome # 小程序 # javascript # 布局 # typecho # 激活码
  • 首页>
  • Javascript>
  • 正文
  • Js中parseFloat()方法所产生的精度问题

    2016年11月08日 1.6 k 阅读 0 评论 1298 字
    <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

     => 二进制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,最终向用户展示的时候再除以对应的数就可以了。

    本文著作权归作者 [ admin ] 享有,未经作者书面授权,禁止转载,封面图片来源于 [ 互联网 ] ,本文仅供个人学习、研究和欣赏使用。如有异议,请联系博主及时处理。
    parsefloatjavascriptjs精度问题
    取消回复

    发表留言
    回复

    首页电影Js前端新旅奇技网安歌单关于
    Copyright©2013-2025  All Rights Reserved.  Load:0.035 s
    豫公网安备41050202000235   豫ICP备18019224号-2
    Theme by OneBlog V3.6.4
    夜间模式

    开源不易,请尊重作者版权,保留基本的版权信息。