写代码的时候,发现js无法正确处理浮点运算,存在bug,解决思路是把js的浮点运算转化为整数运算。

网上查询类似解决方案,基本都是按照上述思路解决,但是解决的时候,并不彻底,在重写的方法中,依然出现了js浮点数与整数的乘法。

用浮点数乘以10的n次方来去掉小数点,或者将去掉小数点之后的计算结果还原。这个地方依然存在浮点数计算,也就依然存在bug。

比如js计算如下算式: 16.65*100=1664.9999999999998

12.65*100 = 1265,这个算式就是正确的,好诡异。

所以,在做浮点数计算时,要避免此类情况。

下面是我写的js浮点计算方法,代码有待优化:

function add(arg1, arg2){
var num1 = arg1.toString();
var num2 = arg2.toString();
var len1 = 0;
var len2 = 0;
var intnum1 = 0;
var intnum2 = 0;
var powres = 0;
var resstr = "";
if(num1.indexOf(".") > 0){
len1 = num1.substr(num1.indexOf("."),num1.length-1).length - 1;
}
if(num2.indexOf(".") > 0){
len2 = num2.substr(num2.indexOf("."),num2.length-1).length - 1;
}
if(len1 == 0 && len2 == 0){
return arg1 + arg2;
}
var powc = Math.max(len1,len2);
if(len1 > len2){
var temp0 = "";
for(var i=0; i<len1-len2; i++){
temp0 += 0;
}
intnum1 = parseInt(num1.replace(".",""));
intnum2 = parseInt(num2.replace(".","") + temp0);
}
if(len2 > len1){
var temp0 = "";
for(var i=0; i<len2-len1; i++){
temp0 += 0;
}
intnum2 = parseInt(num2.replace(".",""));
intnum1 = parseInt(num1.replace(".","") + temp0);
}
if(len1 == len2){
intnum1 = parseInt(num1.replace(".",""));
intnum2 = parseInt(num2.replace(".",""));
}
powres = intnum1 + intnum2;
// powres = powres.toString();
// resstr = powres.substr(0,powres.length-powc) + "." + powres.substr(powres.length-powc,powres.length);
var symb = "";
if(powres < 0){
symb = "-";
}
powres = Math.abs(powres).toString();
if(powres.length <= powc){
var temp0 = "";
for(var i=0; i<powc-powres.length; i++){
temp0 += 0;
}
resstr = symb + "0." + temp0 + powres;
}else{
resstr = symb + powres.substr(0,powres.length-powc) + "." + powres.substr(powres.length-powc,powres.length);
}
return parseFloat(resstr);
}

function sub(arg1, arg2){
var num1 = arg1.toString();
var num2 = arg2.toString();
var len1 = 0;
var len2 = 0;
var intnum1 = 0;
var intnum2 = 0;
var powres = 0;
var resstr = "";
if(num1.indexOf(".") > 0){
len1 = num1.substr(num1.indexOf("."),num1.length-1).length - 1;
}
if(num2.indexOf(".") > 0){
len2 = num2.substr(num2.indexOf("."),num2.length-1).length - 1;
}
if(len1 == 0 && len2 == 0){
return arg1 + arg2;
}
var powc = Math.max(len1,len2);
if(len1 > len2){
var temp0 = "";
for(var i=0; i<len1-len2; i++){
temp0 += 0;
}
intnum1 = parseInt(num1.replace(".",""));
intnum2 = parseInt(num2.replace(".","") + temp0);
}
if(len2 > len1){
var temp0 = "";
for(var i=0; i<len2-len1; i++){
temp0 += 0;
}
intnum2 = parseInt(num2.replace(".",""));
intnum1 = parseInt(num1.replace(".","") + temp0);
}
if(len1 == len2){
intnum1 = parseInt(num1.replace(".",""));
intnum2 = parseInt(num2.replace(".",""));
}
powres = intnum1 - intnum2;
var symb = "";
if(powres < 0){
symb = "-";
}
powres = Math.abs(powres).toString();
if(powres.length <= powc){
var temp0 = "";
for(var i=0; i<powc-powres.length; i++){
temp0 += 0;
}
resstr = symb + "0." + temp0 + powres;
}else{
resstr = symb + powres.substr(0,powres.length-powc) + "." + powres.substr(powres.length-powc,powres.length);
}
return parseFloat(resstr);
}

function mul(arg1, arg2){
var num1 = arg1.toString();
var num2 = arg2.toString();
var len1 = 0;
var len2 = 0;
var intnum1 = 0;
var intnum2 = 0;
var powres = 0;
var resstr = "";
if(num1.indexOf(".") > 0){
len1 = num1.substr(num1.indexOf("."),num1.length-1).length - 1;
}
if(num2.indexOf(".") > 0){
len2 = num2.substr(num2.indexOf("."),num2.length-1).length - 1;
}
if(len1 == 0 && len2 == 0){
return arg1 + arg2;
}
var powc = len1 + len2;
intnum1 = parseInt(num1.replace(".",""));
intnum2 = parseInt(num2.replace(".",""));

powres = intnum1 * intnum2;
var symb = "";
if(powres < 0){
symb = "-";
}
powres = Math.abs(powres).toString();
if(powres.length <= powc){
var temp0 = "";
for(var i=0; i<powc-powres.length; i++){
temp0 += 0;
}
resstr = symb + "0." + temp0 + powres;
}else{
resstr = symb + powres.substr(0,powres.length-powc) + "." + powres.substr(powres.length-powc,powres.length);
}
return parseFloat(resstr);
}

function div(arg1, arg2){
var num1 = arg1.toString();
var num2 = arg2.toString();
var len1 = 0;
var len2 = 0;
var intnum1 = 0;
var intnum2 = 0;
var powres = 0;
var resstr = "";
if(num1.indexOf(".") > 0){
len1 = num1.substr(num1.indexOf("."),num1.length-1).length - 1;
}
if(num2.indexOf(".") > 0){
len2 = num2.substr(num2.indexOf("."),num2.length-1).length - 1;
}
if(len1 == 0 && len2 == 0){
return arg1 + arg2;
}
var powc = len1 - len2;
intnum1 = parseInt(num1.replace(".",""));
intnum2 = parseInt(num2.replace(".",""));

powres = intnum1 / intnum2;
var symb = "";
if(powres < 0){
symb = "-";
}
if(powc > 0){
powres = Math.abs(powres).toString();
if(powres.length < powc){
var temp0 = "";
for(var i=0; i<powc-powres.length; i++){
temp0 += 0;
}
resstr = symb + "0." + temp0 + powres;
}else{
resstr = symb + powres.substr(0,powres.length-powc) + "." + powres.substr(powres.length-powc,powres.length);
}
}
if(powc < 0){
powres = Math.abs(powres).toString();
powc = Math.abs(powc);
if(powres.length <= powc){
var temp0 = "0";
for(var i=0; i<powc-powres.length; i++){
temp0 += 0;
}
resstr = symb + powres + temp0;
}else{
resstr = symb + powres.substr(0,powres.length-powc) + "." + powres.substr(powres.length-powc,powres.length);
}
}

return parseFloat(resstr);
}

posted on 2014-08-11 16:35  newyear821  阅读(465)  评论(0编辑  收藏  举报