├── 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 |
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