normalize.js
/**
* Get rid of float remainder
*
* @module mumath/normalize
*/
'use strict';
var almost = require('almost-equal');
module.exports = function(value, eps) {
//ignore ints
var rem = value%1;
if (!rem) return value;
if (eps == null) eps = Number.EPSILON || almost.FLT_EPSILON;
//pick number’s neighbour, which is way shorter, like 0.4999999999999998 → 0.5
//O(20)
var range = 5;
var len = (rem+'').length;
for (var i = 1; i < range; i+=.5) {
var left = rem - eps*i,
right = rem + eps*i;
var leftStr = left+'', rightStr = right + '';
if (len - leftStr.length > 2) return value - eps*i;
if (len - rightStr.length > 2) return value + eps*i;
// if (leftStr[2] != rightStr[2])
}
return value;
};