Distribute Percent Range, Given Minimum Percent

JavaScript

var range = [190, 2453, 234, 14, 1244, 532, 0, 3, 1999];
var minimumPercent = 0.02;

function distributeRangeGivenMinimum(range, min) {
    var sum = 0;
    for (var i = 0; i < range.length; i++) {
        sum += range[i];
    }

    var percents = [];
    for (var i = 0; i < range.length; i++) {
        percents.push(range[i] / sum);
    }

    var amtToSubtract = 0;
    var timesUnderMin = 0;
    for (var i = 0; i < range.length; i++) {
        if (percents[i] < min) {
            amtToSubtract += (min - percents[i]);
            timesUnderMin++;
            percents[i] = min;
        }
    }

    var timesOverMin = percents.length - timesUnderMin;
    // begin new section
    do {
        var prevTimesOverMin = timesOverMin;
        var distSubAmt = amtToSubtract / timesOverMin;
        for (var i = 0; i < range.length; i++) {
            if (percents[i] > min && percents[i] - distSubAmt < min) {
                amtToSubtract -= (percents[i] - min);
                timesOverMin--;
                percents[i] = min;
            }
        }
    } while (timesOverMin != prevTimesOverMin);
    // end new section

    if (timesOverMin > 0) {
        for (var i = 0; i < range.length; i++) {
            if (percents[i] > min) {
                percents[i] = percents[i] - (amtToSubtract / timesOverMin);
            }
        }
    }

    return percents;
}