如何解决2进制⼩数不精确的问题
如何解决2进制⼩数不精确的问题
⼀、总结
⼀句话总结:
> 我们可以把需要进⾏计算的⼩数转成整数进⾏计算,然后在变成⼩数
⼆、解决js中浮点数(⼩数)计算不准确问题
1. 原因
js计算最终也是通过计算机进⾏计算,⽽计算机只能识别⼆进制的0和1,也就是说我们所写的计算都必须转成⼆进制数才能进⾏计算,然⽽有些⼩数转成⼆进制数的时候除不尽,出现⽆限⼩数位,这时候就只能取近似值进⾏计算,导致了我们所遇到的不准确的问题。
2. 解决⽅案
解决思路:我们可以把需要进⾏计算的⼩数转成整数进⾏计算,然后在变成⼩数
可以像我这样写⼀个⼯具⽅法:
//四则运算化成整数计算⽅法
var floatCalc = function (a, b) {
a = a + '',
b = b + '';
var aNum = a.indexOf('.'),
bNum = b.indexOf('.'),
aSum,
bSum,
resultNum,
inta,
intb;
aSum = aNum < 0 ? 0 : a.split('.')[1].length;
bSum = bNum < 0 ? 0 : b.split('.')[1].length;
resultNum = aSum > bSum ? aSum : bSum;
inta = aNum < 0 ? Number(a + (Math.pow(10, resultNum) + '').replace('1', '')) : (function () {
a = a.replace('.', '');
a = resultNum == aSum ? a : a + (Math.pow(10, resultNum - aSum) + '').replace('1', '');
return Number(a);
}())
intb = bNum < 0 ? Number(b + (Math.pow(10, resultNum) + '').replace('1', '')) : (function () {
b = b.replace('.', '');
b = resultNum == bSum ? b : b + (Math.pow(10, resultNum - bSum) + '').replace('1', '');
return Number(b);
}())
return {
a: inta,
b: intb,
num: resultNum
};
}
//加法
Number.prototype.add = function (n) {
var o = floatCalc(this, n);
return (o.a + o.b) / Math.pow(10, o.num);
}
//减法
Number.prototype.minus = function (n) {
var o = floatCalc(this, n);
return (o.a - o.b) / Math.pow(10, o.num);
}
//乘法
Number.prototype.subtract = function (n) {
var o = floatCalc(this, n);
return (o.a * o.b) / Math.pow(10, o.num * 2);
}
indexof空格算不算//除法
Number.prototype.divide = function (n) {
var o = floatCalc(this, n);
return (o.a / o.b);
}
这样就可以直接使⽤Number原型上的这些⽅法进⾏计算了
console.log(686.40.add(62.41));
console.log(1.22.minus(1));
console.log(10.40.subtract(6));
console.log(1..divide(1.22));
注意:Number类型的整数直接调⽤原型上的⽅法会报错,引擎不能区分是⼩数点还是调⽤⽅法的点,这时候多写⼀个点或者加空格都可以(⼀般业务场景都是变量进⾏调⽤)

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。