首页 > 代码库 > JS-- 浮点数运算处理

JS-- 浮点数运算处理

    一. 问题描述

     最近在做一个项目,页面上会存在一些JS浮点数的运算,发现JS浮点数运算存在一些bug.譬如:

0.1+0.2 == 0.300000000000000040.1 + 0.7 == 0.79999999999999997*0.8 == 5.60000000000000055.6/7 == 0.7999999999999999

 

   二.解决方案    

   JS运算后都会有很小的误差. 不像.Net或者Java那样准确. 主要是JS重点不在运算上面,可是有时候项目一定要用到.想了一下大概有两种解决方案

     A 方案一: 

    运算结果保留2-3位小数位数. 前端界面一般用到的运算比较少。精度要求不会太高。 所以取2位小数位即可。

     B. 方案二:

           将小数位数转换为整数运算. 譬如:

0.1+0.2 =》 (1+2)/10 == 0.30.1 + 0.7 =》 (1+7)/10 == 0.87*0.8 == (7*8)/10 == 5.65.6/7 == (56/7)/10 == 0.1

       为了方便调用. 所以我们可以提取一个公共的方法出来.譬如下面的JSMath库,JSMath重写了加减乘除. 会先将参数转换为整数再运算JSMath(参数1).操作(参数2)

       参数1和参数2分别就是运算的第一个Number和第二个Number. 计算后通过Value属性获取值.

(function() {    var JSMath = function() {        return this;    }    JSMath.prototype.from = function(value) {        // 支持JSMath参数传递主要是用于嵌套的调用        if ((typeof(value) == ‘object‘) && (value.value != undefined)) {            this.value = http://www.mamicode.com/value.value;>
 

           B1.基本运算

0.1+0.2=> JSMath(0.1).add(0.2).value =http://www.mamicode.com/= 0.3>

        B2.多目运算

0.05 + 0.05 + 0.2=> JSMath(JSMath(0.05).add(0.05)).add(0.2).value =http://www.mamicode.com/= 0.3>

  三.小总结

    上面自己自己暂时知道的一些解决方案.不太清楚是否有开源的更可靠的三方库来解决这个问题,如果有的话,希望博友推荐一下。

            贴一下Stockoverflow 里面看到的一些解决方案:

            http://stackoverflow.com/questions/1458633/how-to-deal-with-floating-point-number-precision-in-javascript

           http://stackoverflow.com/questions/3556789/javascript-math-error-inexact-floats

JS-- 浮点数运算处理