2个数字之间的差异

Ger*_*orm 63 c# algorithm math numbers

我需要完美的算法或C#函数来计算2个十进制数之间的差异(距离).

例如之间的差:
1002575
100-25125
-100-11515
-500100600

是否有一个C#函数或一个非常优雅的算法来计算这个,或者我必须分别使用if s 处理每个案例.

如果有这样的功能或算法,那是哪一个?

ter*_*tyl 110

你可以这样做

public decimal FindDifference(decimal nr1, decimal nr2)
{
  return Math.Abs(nr1 - nr2);
}
Run Code Online (Sandbox Code Playgroud)

  • 当然,没有必要将此代码放入单独的函数中,但更多的是用于澄清 (4认同)
  • 崩溃时`(NR1 - NR 2)= Int32.MinValue` - 的问题[这里](http://stackoverflow.com/questions/38702478/difference-between-two-large-numbers-c-sharp) (4认同)

Mar*_*tin 30

result = Math.Abs(value1 - value2);
Run Code Online (Sandbox Code Playgroud)

  • :p 不敢相信花了两年时间才有人接受我:) (2认同)
  • **极度警告**:*当“value1-value2”等于“Int32.MinValue”时,由于“System.OverflowException”异常,*此代码将崩溃*。更多详细信息[此处](/sf/ask/2709173491/)。 (2认同)

Mec*_*cki 21

只是添加这个,因为没人在这里写:

虽然你可以肯定使用

Math.Abs(number1 - number2);
Run Code Online (Sandbox Code Playgroud)

这是最简单的解决方案(并且接受了答案),我想知道没有人写出Abs实际上做了什么.这是一个适用于Java,C,C#的解决方案,以及使用C语法的所有其他语言:

int result = number1 - number2;
if (result < 0) {
    result *= -1;
}
Run Code Online (Sandbox Code Playgroud)

就这么简单.你也可以像这样写:

int result = number1 > number2 ? number1 - number2 : number2 - number1;
Run Code Online (Sandbox Code Playgroud)

一旦编译完毕,最后一个可能会更快; 两者都有一个if和一个减法,但第一个在某些情况下有乘法,最后一个没有.为什么只在某些情况下?有些CPU有一个"交换符号"操作,编译器识别*= -1它做什么,它只是交换符号,所以它不是乘法,而是为提供它的CPU发出交换符号操作,这个操作和CPU操作一样快可以得到(通常一个时钟周期).

第一个代码示例实际上正在执行Abs在大多数实现中所做的事情,以便在支持的情况下使用"交换符号",最后一个代码将在没有"交换符号"的CPU上更快,并且乘法比添加更昂贵(在现代CPU,它们通常同样快速).

  • @Aelphaeis你的编辑是假的; 除非您完全理解某个主题,否则请不要编辑帖子.当然它适用于负整数.例如`number1`是'100`而`number2`是`-100`:`100 - (-100)= 200`这是正确的.或者看到这个`(-50) - (-80)= 30`,这也是正确的.它不适用于`int.MaxValue`和`int.MinValue`的原因是因为它们之间的区别是'4'294'967'295`,但适合`int`的最大数字是`2 '147'483'647`因此你会使它溢出两次. (2认同)
  • 使用 `result = -result` 而不是 `result *= -1`。毕竟,这就是“-”(负)运算符的用途。 (2认同)

joh*_*hnc 5

我认为在C#中不可能,你可能需要考虑在Assembler中实现它

  • 不知道该解决方案背后的数学原理的人不一定会知道是否可能,尤其是当他们有可行的替代方案时。在这种情况下,干humor的幽默是无法检测到的,因此,低票是完全合理的。有趣与否,这是错误的信息。 (2认同)