在开发中,很多时候都要处理浮点数的相加减运算,所以特地在此记录一下。
问题原因:产生该问题的原因是因为在计算机中,是利用二进制来表示小数,有些小数是用二进制表现不出来的,所以产生了精度问题。
例子:0.1+0.2 按照我们常规思路,他是等于0.3的,但是在计算机中 0.1+0.2 = 0.30000000000000004
解决思路:将浮点数转化为整数,相加减了之后在将结果转化为浮点数。
代码:
- 两个浮点数相减返回精确结果:
// 两个浮点数相减返回精确结果 function subFloatToInt(minuend,subtraction) { var decimalLength,totalValue,minuendLength,subtractionLength; try { minuendLength = minuend.toString().split(".")[1].length; } catch (e) { minuendLength = 0; } try { subtractionLength = subtraction.toString().split(".")[1].length; } catch (e) { subtractionLength = 0; } decimalLength = minuendLength >= subtractionLength ? minuendLength : subtractionLength; totalValue = ((minuend*Math.pow(10,decimalLength) - subtraction*Math.pow(10,decimalLength))/ Math.pow(10,decimalLength)).toFixed(decimalLength); return totalValue; }
- 两个浮点数相加返回精确结果:
// 两个浮点数相加返回精确结果
function accAdd(addendOne, addendTwo) {
var addendOneLength, addendTwoLength, maxValue, absValue;
try {
addendOneLength = addendOne.toString().split(".")[1].length;
}
catch (e) {
addendOneLength = 0;
}
try {
addendTwoLength = addendTwo.toString().split(".")[1].length;
}
catch (e) {
addendTwoLength = 0;
}
// 判断绝对值的结果,
absValue = Math.abs(addendOneLength - addendTwoLength);
maxValue = Math.pow(10, Math.max(addendOneLength, addendTwoLength));
if (absValue > 0) {
var power = Math.pow(10, absValue);
if (addendOneLength > addendTwoLength) {
addendOne = Number(addendOne.toString().replace(".", ""));
addendTwo = Number(addendTwo.toString().replace(".", "")) * power;
} else {
addendOne = Number(addendOne.toString().replace(".", "")) * power;
addendTwo = Number(addendTwo.toString().replace(".", ""));
}
} else {
addendOne = Number(addendOne.toString().replace(".", ""));
addendTwo = Number(addendTwo.toString().replace(".", ""));
}
return (addendOne + addendTwo) / maxValue;
}
按照上述思路,我们在后台编写代码的时候也能够对浮点数进行处理,但是推荐用 BigDecimal