dfcreative/mumath

View on GitHub
normalize.js

Summary

Maintainability
A
45 mins
Test Coverage
/**
 * 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;
};