将一个范围内的数字转换为另一个范围内的数字[重复]
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] 范围内的数字 [重复]