1cco
10/10/2017 - 11:52 AM

Round the floating-point numbers

浮動小数点数を、丸め誤差が発生しないように計算する。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