我可以反转这个功能吗?

时间:2014-02-17 04:18:08

标签: javascript math

我有“scaledValue”,我想找到“Value”,

但似乎不可能? (接受类似的价值)

var priceBound = [0, 10000000];
var priceCurves = [1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1.2, 1.4, 1.6, 1.8, 5, 35, 70, 100];

function calcScaledPrice(Value) {
    var currentValue = Value;
    var currentFixed = Value - priceBound[0];

    var fixedBound = priceBound[1] - priceBound[0];

    var currentPercent = Math.round((currentFixed / fixedBound) * 20);
    var currentScale = priceCurves[currentPercent];
    var scaledValue = Math.round(currentValue * (currentScale / 100));

    return scaledValue;
}

3 个答案:

答案 0 :(得分:0)

没有单个输入值可以生成特定的输出值,因此无法提供明确的答案。但是,可以生成 a 值,这将导致特定的缩放值,只是它不会是唯一的。 e.g。

calcScaledPrice(150));  // 2
calcScaledPrice(200));  // 2

以下生成一系列候选值,然后返回创建合适缩放值的第一个值。不是特别优雅,但它做的工作(只有轻微测试,所以谨慎使用)。还有其他迭代方法,例如使用一种二进制搜索算法来找到合适的值。

function calcValue(scaledValue) {
    var fixedBound = priceBound[1] - priceBound[0];
    var possibleCurrentValues = [];
    var currentFixed, currentScale, value;

    // Generate a matrix of possible values
    for (var i=0, iLen=priceCurves.length; i<iLen; i++) {
        possibleCurrentValues.push(Math.round(scaledValue * 100 / priceCurves[i]));
    }

    // Return the first possibleCurrentValue that generates
    // a suitable scaled value
    for (var j=0, jLen=possibleCurrentValues.length; j<jLen; j++) {
        value = possibleCurrentValues[j]
/*
        // Do the calculation of calcScaledPrice
        currentFixed = value - priceBound[0];    
        currentPercent = Math.round((currentFixed / fixedBound) * 20);
        currentScale = priceCurves[currentPercent];

        if (Math.round(value * currentScale / 100) == scaledValue) {
            return value;
        }
*/
        // Simpler, depends on calcScaledPrice function
        if (calcScaledPrice(value) == scaledValue) {
            return value;
        }
    }
    return "not found";
}

calcValue(2)  // 200
calcValue(50) // 5000

答案 1 :(得分:0)

您的程序使用线性规则和舍入将价格从范围[0..10000000]中的值转换为范围[0..20]中的整数。然后(单调增长)查找表返回应用于原始值的百分比。

因此,您获得的是分段线性函数,其在百分比变化时是不连续的。例如,值6249999和6250000将映射到百分比0.01和0.012,产生输出62499,99和75000.在62499,99和75000之间的scaledValue确实对应于任何Value

答案 2 :(得分:0)

您的功能不是双头投射,因为由于Math.round(),您将域中的多个值映射到相同的值。此时,您仍然可以检索给定缩放值的一系列值。