码迷,mamicode.com
首页 > Web开发 > 详细

js 小数计算为啥和想象中不一样!

时间:2017-08-24 23:58:29      阅读:416      评论:0      收藏:0      [点我收藏+]

标签:多少   ==   tofixed   mat   style   进制   ros   通过   相加   

           今天遇到了一个比较有趣的事,如果要你计算0.1+0.2等于多少你会怎么回答? “0.3啊!”你可能都不会考虑。我也一样,当a=0.1,b=0.2时 if(a+b === 0.3){...}。我可能等一下午都等不到大括号中的内容被执行。

   为啥呢?因为在js中0.1+0.2=0.30000000000000004。说起来你可能不信,又或者去验证一下。结果为啥是这样?在我查找资料之后豁然开朗。对于浮点型数据,大多语言计算都会丢失精度。但是像c++/java这种厉害的语言都有自己封装的一套方法解决这一问题。js属于弱类型解释性语言。大家可以品一品这句话。

  深究一下为啥会丢失精度?那么就找到了计算机,计算机说我只认识二进制的数。那么我们就给他二进制数。0.1的二进制表示是无限循环小数0.0001100110011001100...

0.2的二进制表示是0.0011001100110011...,那么相加也应该是无限循环小数才对啊!不,双精度浮点型数据对小数点后最多取52位,所以是 0.01001100110011001100110

01100110011001100110011001100,然后转化为10进制就是0.30000000000000004。这下是不是就清楚了为啥丢了精度?

       虽然会丢失精度,而且js没有自己封装解决办法,但是这些都没有好关系,因为我相信所有的问题都有对应的解决办法。js的解决办法太多。通过Math对象的api。通过Number对象的toFixed。所以这些都不会影响js 的魅力!

 

2017.8.24 上海!22:10  

 

js 小数计算为啥和想象中不一样!

标签:多少   ==   tofixed   mat   style   进制   ros   通过   相加   

原文地址:http://www.cnblogs.com/liuxiaohuan/p/7425519.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!