UNPKG

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
"use strict"; 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;