73

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

例如:
10025之间的差异是75
100-25125
-100-11515
-500100600

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

如果有这样的函数或算法,它是哪一个?

4

5 回答 5

129

你可以这样做

public decimal FindDifference(decimal nr1, decimal nr2)
{
  return Math.Abs(nr1 - nr2);
}
于 2008-12-04T09:11:32.573 回答
34
result = Math.Abs(value1 - value2);
于 2008-12-04T09:12:03.353 回答
28

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

虽然你肯定可以使用

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,它们通常同样快)。

于 2008-12-08T11:11:51.003 回答
4

我认为在 C# 中不可能,您可能需要查看在 Assembler 中实现它

于 2008-12-04T09:18:43.590 回答
1

这就是我在企业项目中的做法:

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);

        }
    }
}
于 2019-11-09T00:09:36.853 回答