将一个范围内的数字转换为另一个范围内的数字[重复]

Posted

技术标签:

【中文标题】将一个范围内的数字转换为另一个范围内的数字[重复]【英文标题】:Convert numbers within a range to numbers within another range [duplicate] 【发布时间】:2011-05-12 21:28:04 【问题描述】:

可能重复:Convert a number range to another range, maintaining ratio

所以我有一个函数可以返回 0 到 255 之间的值,我需要将这些值转换为 -255 到 255 之间的值 所以 200 大约是 145,150 大约是 45,依此类推.. 我看过Convert a number range to another range, maintaining ratio,但那里的公式不起作用。 我可以使用任何其他公式吗?

【问题讨论】:

为什么那里的公式不适合你? 提供的链接确实是最简单的方法。你能举个例子说明为什么它不工作吗? var oldRange = 高 - 低; var newRange = newHigh - newLow; var newNumber = oldNumber * (oldRange/newRange);这是正确的吗?如果是这样,您关于 200 -> 145 和 150 -> 45 的数学运算就关闭了 :) 0 - 255 已经在 -255 - 255 的范围内...我看不出问题。 :-P @user425291:您在另一个问题的答案中错误地阅读了公式。它说除以(OldMax - OldMin),然后添加 NewMin。 【参考方案1】:
public static int ConvertRange(
    int originalStart, int originalEnd, // original range
    int newStart, int newEnd, // desired range
    int value) // value to convert

    double scale = (double)(newEnd - newStart) / (originalEnd - originalStart);
    return (int)(newStart + ((value - originalStart) * scale));

【讨论】:

这是对这个问题的最佳答案。请注意,这只是 the question the OP linked to 中(正确)公式的 C# 实现 这是一个很好的答案。如果要转换的值高于和低于原始范围,那么如何将其剪辑为所需范围的最小值或最大值。例如'int val = ConvertRange(20, 110, 0, 100, 10);'那么 val 为 0 'int val = ConvertRange(20, 110, 0, 100, 111);那么 val 是 100'【参考方案2】:

试试这个:

int Adjust( int num )

    return num * 2 - 255;

【讨论】:

编辑中的错字,应该是return num * 2 - 255; ? @jball:谢谢。这就是我在第一关的方式。感谢您发现胖手指的错误! 我会选择这个,因为它最简单。我仍然想知道为什么我无法获得链接到的示例。一定是看同一个东西太久了!谢谢! @JimFell 你是怎么做出这个公式的?请让我知道我有一个奇怪的***.com/questions/44067314/… @JimFell 我有一个奇怪的数字模式,我想将其转换为 24 小时格式时间。【参考方案3】:

任意范围的通用解决方案...

var val1 = 200;
var min1 = 0;
var max1 = 255;
var range1 = max1 - min1;

var min2 = -255;
var max2 = 255;
var range2 = max2 - min2;

var val2 = val1*range2/range1 + min2;

【讨论】:

【参考方案4】:
public int ConvertRange(
           int originalStart, int originalEnd,
           int newStart, int newEnd,
           int value)


  int originalDiff = originalEnd - originalStart;
  int newDiff = newEnd - newStart;
  int ratio = newDiff / originalDiff;
  int newProduct = value * ratio;
  int finalValue = newProduct + newStart;
  return finalValue; 


【讨论】:

【参考方案5】:

调整后 = 原始 / 255 * 510 - 255

145 = 200 / 255 * 510 - 255
 45 = 145 / 255 * 510 - 255

【讨论】:

我看不到这将如何解决签名问题。 @Jim Fell,什么签名问题? 什么是签名问题?插入原始值 1 得到 -253,插入 200 得到 145。似乎可行。 @Sir Robert:看起来 OP 想要将(0 到 255)之间的给定数字重新调整为(-255 到 255)。您的解决方案似乎无法解决将小于 128 的数字转换为负数范围的问题。 @Jim Fell - 操作顺序表示最终的 -255 发生在所有其他操作之后,正确地将最初的 (0 to 127) 值调整为新的负值 (-255 to -1)

以上是关于将一个范围内的数字转换为另一个范围内的数字[重复]的主要内容,如果未能解决你的问题,请参考以下文章

将一个范围内的值转换为另一个范围内的值

设计一个 O(n) 算法来找到一个不在 [0,n-1] 范围内的数字 [重复]

随机数生成器不会使用输入字段中的值生成给定范围内的预期数字[重复]

AS3将一个范围内的数字映射到另一个范围

JAVA怎么实现从指定范围随机取不重复的6个数字

剑指offer_查找数组中的任一重复元素