js处理浮点数一点思考

做为一名web开发人员,若是咱们作到了涉及到费用加加减减的需求 不免会遇到浮点数的计算,就会遇到浮点数精度偏差的问题前端

假设场景:web

           1.接口给你的金额单位是分,页面须要展现的金额单位为元。 最后落档金额为分数据库

           2.需求能够输入优惠金额单位为元(即 用户能够输入浮点数)须要计算实付金额。函数

问题:spa

        第一个场景中 由于金额经历了 从分-->元--->分的历程。 咱们实现分到元的是除以100 从分到元是用的是乘以100。 看上去毫无破绽 没看出什么有什么逻辑问题。可是浮点数计算会有计算偏差(相关原理,我就不赘述了) 举个例子3d

       接口给的金额是128109分。咱们作页面展现为1281.09元(分-->元)blog

       这个时候 咱们须要将数据落档了 须要将128109存入数据库 咱们理所固然的用 1281.09*100 (元-->分) 而后咱们发现了什么?接口

 

咱们再parseInt取整一下,完了,变成128108了 少了一分钱!! 为了这个问题 看代码看到了大半夜 都没看出来 哪里少了一分钱。原来是浮点数计算的偏差致使少了一分钱。开发

      第二个场景会涉及到浮点数计算 那就更灾难了。0.1+0.2 不等于0.3的状况 相信你们都有所耳闻。字符串

解决办法:

     1.我我的以为最好的解决办法是前端不作计算。只作展现。就是说 像第一种场景 别本身写 分-->元--->分,把项目这里取值所有直接去取接口返回的分。

     2.可是咱们没办法,前台可能会输入浮点数,咱们只能处理。这个时候咱们要将浮点数转为整数,避免掉浮点数的运算。等计算完再转为浮点数。

     这里有一个注意点,咱们须要先知道咱们要计算的浮点数是多少位的。而后咱们将浮点数乘以大于精度值的值再去作计算。换句话说 两位小数乘以1000,三位小数乘以10000.

再看会上面那个例子

 

由于我项目中只会存在两位小数。因此 我直接乘以了1000 再除以1000

那有的项目中可能浮点数的精度并不固定。这个时候咱们须要将这个浮点数变成字符串,再经过字符切割函数,将这个数变成小数和整数部分。最后获取小数部分的长度。这样咱们就能知道要乘以多少了。

 

 

 

 转为整数后 在进行计算 最后别忘了再转为浮点数

相关文章
相关标签/搜索