36 lines
765 B
JavaScript
36 lines
765 B
JavaScript
/**
|
||
* 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;
|
||
};
|