RoundToEven

Banker's rounding in JavaScript

by Moslem Hady

JavaScript

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;
}

function outputRound(num, decimalPlaces) {
    var para = document.createElement("p");
    para.innerHTML = num + " with " + (decimalPlaces || 0) + " decimal places -> " + evenRound(num, decimalPlaces);
    document.body.appendChild(para);
}

outputRound(1.5); // 2
outputRound(2.5); // 2
outputRound(1.535, 2); // 1.54
outputRound(1.525, 2); // 1.52