reliable-round
Version:
A rounding library for JavaScript that behaves predictably (unlike Math.round, Math.floor, Math.ceil).
73 lines (72 loc) • 2.78 kB
JavaScript
;
exports.__esModule = true;
function round(value, decimalPlacesToRoundTo) {
if (decimalPlacesToRoundTo === void 0) { decimalPlacesToRoundTo = 0; }
var isNegative = value < 0;
var numberAsString = numberToString(value);
var parts = numberAsString.split('.');
var integerPart = parts[0].replace('-', '');
var decimalPart = parts[1] || '';
if (decimalPart === '') {
return value;
}
var integerDigits = ['0'].concat(integerPart.split(''));
var decimalDigits = decimalPart.split('').concat(['0']);
var allDigits = integerDigits.concat(decimalDigits);
var startIndex = Math.min(integerDigits.length + decimalPlacesToRoundTo, allDigits.length - 1);
var stopRoundingAtIndex = integerDigits.length - 1 + decimalPlacesToRoundTo;
if (startIndex < allDigits.length - 1) {
allDigits.splice(startIndex + 1, decimalDigits.length - 1);
}
var carry = 0;
for (var index = startIndex; index > -1; index--) {
var digit = parseInt(allDigits[index], 10);
var newDigit = void 0;
if (index > stopRoundingAtIndex) {
newDigit = 0;
carry = digit + carry >= 5 ? 1 : 0;
}
else {
newDigit = (digit + carry) % 10;
carry = digit + carry >= 10 ? 1 : 0;
}
allDigits[index] = newDigit.toString();
}
allDigits.splice(integerDigits.length, 0, '.');
var absoluteResult = parseFloat(allDigits.join(''));
var result = isNegative ? -absoluteResult : absoluteResult;
return result;
}
exports.round = round;
// tslint:disable-next-line:max-line-length
// Sourced from: https://stackoverflow.com/questions/1685680/how-to-avoid-scientific-notation-for-large-numbers-in-javascript/46545519#46545519
function numberToString(value) {
var tempValue = value;
var numStr = String(tempValue);
if (Math.abs(tempValue) < 1.0) {
var e = parseInt(tempValue.toString().split('e-')[1], 10);
if (e) {
var negative = tempValue < 0;
if (negative) {
tempValue *= -1;
}
tempValue *= Math.pow(10, e - 1);
// tslint:disable-next-line:prefer-array-literal
numStr = '0.' + (new Array(e)).join('0') + tempValue.toString().substring(2);
if (negative) {
numStr = '-' + numStr;
}
}
}
else {
var e = parseInt(tempValue.toString().split('+')[1], 10);
if (e > 20) {
e -= 20;
tempValue /= Math.pow(10, e);
// tslint:disable-next-line:prefer-array-literal
numStr = tempValue.toString() + (new Array(e + 1)).join('0');
}
}
return numStr;
}
exports.numberToString = numberToString;