Гауссово округление / округление банкира в JavaScript

Я использовал Math.Round(myNumber, MidpointRounding.ToEven) в C#, чтобы сделать мое округление серверной стороны, однако, пользователя должно знать 'живой', чем будет состоять в том результат операции серверной стороны, что означает (предотвращение запроса Ajax) создание метода JavaScript копировать MidpointRounding.ToEven метод используется C#.

MidpointRounding. ToEven является Гауссовым округлением / округлением банкира, очень общим методом округления для систем учета, описанных здесь.

У кого-либо есть опыт с этим? Я нашел примеры онлайн, но они не делают вокруг к данному количеству десятичных разрядов...

55
задан Sebastian Simon 19 September 2017 в 16:54
поделиться

1 ответ

function evenRound(num, decimalPlaces) {
    var d = decimalPlaces || 0;
    var m = Math.pow(10, d);
    var n = +(d ? num * m : num).toFixed(8); // Avoid rounding errors
    var i = Math.floor(n), f = n - i;
    var e = 1e-8; // Allow for rounding errors in f
    var r = (f > 0.5 - e && f < 0.5 + e) ?
                ((i % 2 == 0) ? i : i + 1) : Math.round(n);
    return d ? r / m : r;
}

console.log( evenRound(1.5) ); // 2
console.log( evenRound(2.5) ); // 2
console.log( evenRound(1.535, 2) ); // 1.54
console.log( evenRound(1.525, 2) ); // 1.52

Живая демонстрация: http://jsfiddle.net/NbvBp/

Для того, что выглядит как более строгий подход к этому (я никогда не использовал его), вы можете попробовать это BigNumber реализация.

79
ответ дан 7 November 2019 в 07:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: