├── README.md ├── index.html └── jsFloatCompute.js /README.md: -------------------------------------------------------------------------------- 1 | 这是一个解决JS浮点型数值执行加减乘除精度出错的解决方案 2 | jsFloatCompute.js是源代码 3 | index.html是一个测试运行dome -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 浮点数计算示例 6 | 38 | 39 | 40 |
41 | 42 |

43 | 44 | 45 | 46 | 47 | 48 | 54 |
55 | 56 | 104 | 105 | -------------------------------------------------------------------------------- /jsFloatCompute.js: -------------------------------------------------------------------------------- 1 | /** 2 | * Created by xiewu on 2016/9/11. 3 | */ 4 | //浮点数加减乘除法对象 5 | var jsFloat={ 6 | 'add':addCalc,//加法运算 7 | 'subtract':subtractCalc,//减法运算 8 | 'ride':rideCalc,//乘法运算 9 | 'divide':divideCalc//除法运算 10 | }; 11 | 12 | //加法运算 13 | function addCalc(num0,num1){ 14 | var numLen0=getPointBackLen(num0),//第一个值的的小数位数 15 | numLen1=getPointBackLen(num1),//第二个值的的小数位数 16 | maxLen=Math.max(numLen0,numLen1),//小数位数的最大值 17 | numLenDiff=0,//小数的差数 18 | num0Str='',//第一个值去掉小数点转字符 19 | num1Str='',//第二个值去掉小数点转字符 20 | operationReault=0;//返回计算后的值 21 | 22 | if(maxLen==0){ 23 | operationReault=Number(num0)+Number(num1); 24 | return operationReault; 25 | } 26 | numLenDiff=numLen0-numLen1; 27 | num0Str=clearPoint(num0,"."); 28 | num1Str=clearPoint(num1,"."); 29 | 30 | //根据numLenDiff的正负来判断哪个数字的位数是短的,来走补全 31 | if(numLenDiff>0){ 32 | num1Str=addZeroBack(num1Str,numLenDiff); 33 | }else if(numLenDiff<0){ 34 | num0Str=addZeroBack(num0Str,Math.abs(numLenDiff)); 35 | } 36 | //执行计算 37 | operationReault=addZeroFront((Number(num0Str)+Number(num1Str)).toString(),maxLen); 38 | return Number(operationReault.slice(0,-maxLen)+"."+operationReault.slice(-maxLen)); 39 | } 40 | 41 | //减法运算 42 | function subtractCalc(num0,num1){ 43 | var numLen0=getPointBackLen(num0),//第一个值的的小数位数 44 | numLen1=getPointBackLen(num1),//第二个值的的小数位数 45 | maxLen=Math.max(numLen0,numLen1),//小数位数的最大值 46 | numLenDiff=0,//小数的差数 47 | num0Str='',//第一个值去掉小数点转字符 48 | num1Str='',//第二个值去掉小数点转字符 49 | operationReault=0;//返回计算后的值 50 | 51 | if(maxLen==0){ 52 | operationReault=Number(num0)-Number(num1); 53 | return operationReault; 54 | } 55 | 56 | numLenDiff=numLen0-numLen1; 57 | num0Str=clearPoint(num0,"."); 58 | num1Str=clearPoint(num1,"."); 59 | 60 | //根据numLenDiff的正负来判断哪个数字的位数是短的,来走补全 61 | if(numLenDiff>0){ 62 | num1Str=addZeroBack(num1Str,numLenDiff); 63 | }else if(numLenDiff<0){ 64 | num0Str=addZeroBack(num0Str,Math.abs(numLenDiff)); 65 | } 66 | //执行计算 67 | operationReault=addZeroFront((Number(num0Str)-Number(num1Str)).toString(),maxLen); 68 | return Number(operationReault.slice(0,-maxLen)+"."+operationReault.slice(-maxLen)); 69 | } 70 | 71 | //乘法运算 72 | function rideCalc(num0,num1){ 73 | var num0Len=getPointBackLen(num0),//第一个值的的小数位数 74 | num1Len=getPointBackLen(num1),//第二个值的的小数位数 75 | maxLen=Math.max(num0Len,num1Len),//取得小数位数中的最大数 76 | digitLen=0,//小数位数的统计值 77 | num0Str='',//第一个值去掉小数点转字符存偖 78 | num1Str='',//第二个值去掉小数点转字符存偖 79 | operationReault=0;//计算结果 80 | 81 | if(maxLen===0){//如果数字原本就是整形,直接执行计算 82 | operationReault=Number(num0)*Number(num1); 83 | return operationReault; 84 | } 85 | 86 | num0Str=clearPoint(num0,"."); 87 | num1Str=clearPoint(num1,"."); 88 | digitLen=num0Len+num1Len;//小数位数的总数 89 | 90 | operationReault=addZeroFront((Number(num0Str)*Number(num1Str)).toString(),digitLen);//对乘法运算后的结果执行位数补全 91 | return Number(operationReault.slice(0,-digitLen)+"."+operationReault.slice(-digitLen)); 92 | } 93 | 94 | //除法运算 95 | function divideCalc(num0,num1){ 96 | var num0Len=getPointBackLen(num0),//第一个值的的小数位数 97 | num1Len=getPointBackLen(num1),//第二个值的的小数位数 98 | maxLen=Math.max(num0Len,num1Len),//取得小数位数中的最大数 99 | digitLen,//小数位数的统计值 100 | num0Str,//第一个值去掉小数点转字符存偖 101 | num1Str,//第二个值去掉小数点转字符存偖 102 | operationReault,//计算结果 103 | resultPointNum;//除法后结果的小数位数 104 | 105 | if(maxLen===0){//如果数字原本就是整形,直接执行计算 106 | operationReault=Number(num0)/Number(num1); 107 | return operationReault; 108 | } 109 | 110 | num0Str=clearPoint(num0,"."); 111 | num1Str=clearPoint(num1,"."); 112 | digitLen=num0Len-num1Len;//小数位数的差数 113 | operationReault=Number(num0Str)/Number(num1Str); 114 | if(digitLen==0){//如果除数,被除除数小数位相同,即直接返回计算值 115 | return operationReault; 116 | } 117 | resultPointNum=getPointBackLen(operationReault);//除法计算后可能的小数位数 118 | operationReault=clearPoint(operationReault,".");//除法运算结果去小数位数 119 | digitLen=digitLen+resultPointNum;//最后应该保留的小数位数 120 | if(digitLen>0){//如果要保留的小数位数不够 121 | operationReault=addZeroFront(operationReault,digitLen);//对计算的结果前补0 122 | return Number(operationReault.slice(0,-digitLen)+"."+operationReault.slice(-digitLen)); 123 | }else {//如果要保留的小数位数小于0 124 | digitLen=Math.abs(digitLen); 125 | operationReault=addZeroBack(operationReault,digitLen);//对计算的结果后补0 126 | return Number(operationReault); 127 | } 128 | 129 | } 130 | //后补0补够位数,str是当前的字符串,len是应该补的位数 131 | function addZeroBack(str,len){ 132 | for(var i=0;i