解决思路: 把需要进行计算的小数转成整数进行计算,然后在变成小数
function floatCalc(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);
};
//除法
Number.prototype.divide = function (n) {
var o = floatCalc(this, n);
return (o.a / o.b);
};
注意:Number类型的整数直接调用原型上的方法会报错,引擎不能区分是小数点还是调用方法的点,多写一个点或者加空格
5 .add(3.54);
ES2015/ES6 的语法来对 Number进行扩展,不污染全局
class SuperNumber extends Number {
add(n) {
var o = floatCalc(this,n);
return (o.a + o.b) / Math.pow(10, o.num);
};
subtract(n) {
var o = floatCalc(this, n);
return (o.a * o.b) / Math.pow(10, o.num * 2);
};
minus(n) {
var o = floatCalc(this, n);
return (o.a - o.b) / Math.pow(10, o.num);
}
}
let sum = new SuperNumber(5);sum.add(4);