Created
February 7, 2017 12:21
-
-
Save BrainFeeder/e6d754f1b426b8f6b498f160e7ef5bf4 to your computer and use it in GitHub Desktop.
Rounding floats in JavaScript
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
// Closure | |
(function() { | |
/** | |
* Decimal adjustment of a number. | |
* | |
* @param {String} type The type of adjustment. | |
* @param {Number} value The number. | |
* @param {Integer} exp The exponent (the 10 logarithm of the adjustment base). | |
* @returns {Number} The adjusted value. | |
*/ | |
function decimalAdjust(type, value, exp) { | |
// If the exp is undefined or zero... | |
if (typeof exp === 'undefined' || +exp === 0) { | |
return Math[type](value); | |
} | |
value = +value; | |
exp = +exp; | |
// If the value is not a number or the exp is not an integer... | |
if (isNaN(value) || !(typeof exp === 'number' && exp % 1 === 0)) { | |
return NaN; | |
} | |
// Shift | |
value = value.toString().split('e'); | |
value = Math[type](+(value[0] + 'e' + (value[1] ? (+value[1] - exp) : -exp))); | |
// Shift back | |
value = value.toString().split('e'); | |
return +(value[0] + 'e' + (value[1] ? (+value[1] + exp) : exp)); | |
} | |
// Decimal round | |
if (!Math.round10) { | |
Math.round10 = function(value, exp) { | |
return decimalAdjust('round', value, exp); | |
}; | |
} | |
// Decimal floor | |
if (!Math.floor10) { | |
Math.floor10 = function(value, exp) { | |
return decimalAdjust('floor', value, exp); | |
}; | |
} | |
// Decimal ceil | |
if (!Math.ceil10) { | |
Math.ceil10 = function(value, exp) { | |
return decimalAdjust('ceil', value, exp); | |
}; | |
} | |
})(); | |
// Round | |
Math.round10(55.55, -1); // 55.6 | |
Math.round10(55.549, -1); // 55.5 | |
Math.round10(55, 1); // 60 | |
Math.round10(54.9, 1); // 50 | |
Math.round10(-55.55, -1); // -55.5 | |
Math.round10(-55.551, -1); // -55.6 | |
Math.round10(-55, 1); // -50 | |
Math.round10(-55.1, 1); // -60 | |
Math.round10(1.005, -2); // 1.01 -- compare this with Math.round(1.005*100)/100 above | |
// Floor | |
Math.floor10(55.59, -1); // 55.5 | |
Math.floor10(59, 1); // 50 | |
Math.floor10(-55.51, -1); // -55.6 | |
Math.floor10(-51, 1); // -60 | |
// Ceil | |
Math.ceil10(55.51, -1); // 55.6 | |
Math.ceil10(51, 1); // 60 | |
Math.ceil10(-55.59, -1); // -55.5 | |
Math.ceil10(-59, 1); // -50 | |
// Next is PHP like rounding, found on same page | |
// (@see https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/round) | |
var myNamespace = {}; | |
myNamespace.round = function(number, precision) { | |
var factor = Math.pow(10, precision); | |
var tempNumber = number * factor; | |
var roundedTempNumber = Math.round(tempNumber); | |
return roundedTempNumber / factor; | |
}; | |
myNamespace.round(1234.5678, 1); // 1234.6 | |
myNamespace.round(1234.5678, -1); // 1230 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment