将数字从一个范围转换到另一个范围

7

示例范围1(最小值和最大值):

[40 ... 480]

从1开始的数字范围示例:

[42, 59.4, 78.18, 120.43, 416]

示例范围2:

[10 .. 140]

如何将第一个范围内1到某个值的数值转换为第二个范围内的值?在新范围内,42应该等同于10到11之间的某个值。

我正在使用PHP,但这更像是一个数学问题。

我知道如何将它们对齐到第二个范围:

$diff = $range[0] - $numbers[0];
foreach($numbers as $i => $number){
  $numbers[$i] = $number + $diff;
}

但是只有这些 :(
3个回答

14

你的意思是这样吗?它会线性缩放值以适应新的范围。

var transformRange = (value, r1, r2) => {
  var scale = (r2.max - r2.min) / (r1.max - r1.min)
  return (value - r1.min) * scale;
}

示例用法:

transformRange(100, {max: 150, min: 50}, {max: 1, min: 0}); => 0.5

最佳答案。易于理解。 - adev
5
似乎需要将输出范围的最小值添加到结果中?也就是说:return (value - r1.min) * scale + r2.min。请参见https://jsfiddle.net/afcu4tx0/1/。 - wlf

5
您可以使用此功能(Python)将其中一个范围转换为另一个范围。
def transfrom(x):
    return (x - 40)*(130/440.0) + 10

通常的想法是重新定位范围(确保它们都从零开始),然后找出如何拉伸第一个范围以获得第二个范围。所以步骤如下:
  1. 通过减去40将第一个范围转换为[0-440],并通过减去10将第二个范围转换为[0-130]。这样做是为了获得从零开始的间隔,因为这些间隔易于缩放。
  2. 要将[0-440]中的任何值转换为对应的[0-130]值,您需要将其乘以130/440。您可以将其想象为通过除以440将第一个区间缩小到一个[0-1]区间,然后通过乘以扩展到一个[0-130]区间。
  3. 现在您知道如何从[0-440]转换为[0-130],这意味着要从[40-440]转换为[10-140],您首先需要通过减去40然后乘以130/440,最后再加上10

例如:

>>> transform(40)
10.0
>>> transform(42)
10.590909090909092
>>> transform(220)
63.181818181818187
>>> transform(480)
140.0

1

以下是在我的情况下有效的正确解决方案(使用PHP):

function translations_Range2Range($x, $from_min, $from_max, $to_min, $to_max ) {
    if ($from_max == $from_min)
        return $to_max;
    return ($x - $from_min) * ($to_max - $to_min) / ($from_max - $from_min) + $to_min;
}

$x = 需要翻译的值

$from_min, $from_max = 范围从

$to_min, $to_max = 范围到

如果出现除以零的情况,即($from_max == $from_min),则该函数返回$to_max的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接