我有“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;
}
答案 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()
,您将域中的多个值映射到相同的值。此时,您仍然可以检索给定缩放值的一系列值。