我需要完美的算法或C#函数来计算2个十进制数字之间的差异(距离)。
例如:
100和25之间的差是75
100,而-25是125
-100,-115是15
-500,而100是600
是否有C#函数或非常优雅的算法来计算此值,否则我必须分别使用if s处理每种情况。
如果有这样的功能或算法,那是哪一个呢?
我需要完美的算法或C#函数来计算2个十进制数字之间的差异(距离)。
例如:
100和25之间的差是75
100,而-25是125
-100,-115是15
-500,而100是600
是否有C#函数或非常优雅的算法来计算此值,否则我必须分别使用if s处理每种情况。
如果有这样的功能或算法,那是哪一个呢?
Answers:
你可以这样
public decimal FindDifference(decimal nr1, decimal nr2)
{
return Math.Abs(nr1 - nr2);
}
result = Math.Abs(value1 - value2);
只需添加它,就像这里没有人写的那样:
虽然您可以肯定地使用
Math.Abs(number1 - number2);
这是最简单的解决方案(和可接受的答案),我想知道没有人写下Abs的实际作用。这是一个可以在Java,C,C#和其他所有具有C语法的语言中使用的解决方案:
int result = number1 - number2;
if (result < 0) {
result *= -1;
}
就这么简单。您也可以这样写:
int result = number1 > number2 ? number1 - number2 : number2 - number1;
一旦编译,最后一个甚至可能更快。两者都有一个if和一个减法,但在某些情况下第一个具有乘法,最后一个则没有。为什么仅在某些情况下?一些CPU具有“交换符号”操作,编译器会识别出*= -1
它是做什么的,它只是交换符号,因此,它不会对乘法执行乘法运算,而是对提供该符号的CPU发出交换符号运算,该操作与CPU操作一样快。可以获得(通常一个时钟周期)。
第一个代码示例实际上是在大多数实现中采用Abs所做的事情,以利用受支持的“交换符号”,最后一个示例将在没有“交换符号”的CPU上更快,并且乘法比加法更昂贵(在现代的CPU,它们通常速度都一样快)。
number1
是100
和number2
是-100
:100 - (-100) = 200
这是正确的。或查看this (-50) - (-80) = 30
,这也是正确的。为什么它不工作的原因int.MaxValue
和int.MinValue
是因为这两个之间的差异4'294'967'295
,但数量最多,适合到int
是2'147'483'647
这样的话你使其溢出两次。
result = -result
代替result *= -1
。-
毕竟,这是(负)运算符的作用。
我认为在C#中是不可能的,您可能需要考虑在Assembler中实现它
这就是我在企业项目中做的事情:
namespace Extensions
{
public class Functions
{
public static T Difference<T>(object x1, object x2) where T : IConvertible
{
decimal d1 = decimal.Parse(x1.ToString());
decimal d2 = decimal.Parse(x2.ToString());
return (T)Convert.ChangeType(Math.Abs(d1-d2), typeof(T));
}
}
}
和测试:
namespace MixedTests
{
[TestClass]
public class ExtensionsTests
{
[TestMethod]
public void Difference_int_Test()
{
int res2 = Functions.Difference<int>(5, 7);
int res3 = Functions.Difference<int>(-3, 0);
int res6 = Functions.Difference<int>(-3, -9);
int res8 = Functions.Difference<int>(3, -5);
Assert.AreEqual(19, res2 + res3 + res6 + res8);
}
[TestMethod]
public void Difference_float_Test()
{
float res2_1 = Functions.Difference<float>(5.1, 7.2);
float res3_1 = Functions.Difference<float>(-3.1, 0);
double res5_9 = Functions.Difference<double>(-3.1, -9);
decimal res8_3 = Functions.Difference<decimal>(3.1, -5.2);
Assert.AreEqual((float)2.1, res2_1);
Assert.AreEqual((float)3.1, res3_1);
Assert.AreEqual(5.9, res5_9);
Assert.AreEqual((decimal)8.3, res8_3);
}
}
}