浮動小数点数を、丸め誤差が発生しないように計算する。divideはない 素直に bignumber.js を使うのがいいとおもう。 https://github.com/MikeMcl/bignumber.js/
Number.prototype.round = function(decimals) {
if (decimals === void 0) { decimals = 1; }
return Number((Math.round(this + "e" + decimals) + "e-" + decimals));
};
var Decimal = Decimal || {};
Decimal.getLength = function(value) {
if (value === void 0) { return 0; }
var a = (value + '').split('.'),
result = 0;
if (a.length > 1) {
result = a[1].length;
}
return result;
};
Decimal.multiply = function(value1, value2) {
if (value1 === void 0) { value1 = 0; }
if (value2 === void 0) { value2 = 0; }
var len1 = Decimal.getLength(value1),
len2 = Decimal.getLength(value2),
int1 = Number(value1 + 'e' + len1),
int2 = Number(value2 + 'e' + len2),
result = Number((int1 * int2) + 'e-' + (len1 + len2));
return result;
};
Decimal.subtract = function(value1, value2) {
if (value1 === void 0) { value1 = 0; }
if (value2 === void 0) { value2 = 0; }
var len1 = Decimal.getLength(value1),
len2 = Decimal.getLength(value2),
max = Math.max(len1, len2);
return Number((Number(value1 + 'e' + max) - Number(value2 + 'e' + max)) + 'e-' + max);
};
Decimal.subtract2 = function(value1, value2) {
return Decimal.add(value1, -value2);
};
Decimal.add = function(value1, value2) {
if (value1 === void 0) { value1 = 0; }
if (value2 === void 0) { value2 = 0; }
var len1 = Decimal.getLength(value1),
len2 = Decimal.getLength(value2),
max = Math.max(len1, len2);
return Number((Number(value1 + 'e' + max) + Number(value2 + 'e' + max)) + 'e-' + max);
};
console.log((100 - 99.9)); //0.09999999999999432
console.log(Decimal.subtract(100, 99.9).round()); //0.1
console.log((100 - 99.825)); //0.17499999999999716
console.log(Decimal.subtract(100, 99.825).round(2)); //0.18
console.log((100 * 33.3)); //3329.9999999999995
console.log(Decimal.multiply(100, 33.3)); //3330
console.log((10003.14159 + 2.71828)); //10005.859869999998
console.log(Decimal.add(10003.14159, 2.71828)); //10005.85987