代码之家  ›  专栏  ›  技术社区  ›  Germstorm Pierre-Alain Vigeant

两个数字之间的差异

  •  55
  • Germstorm Pierre-Alain Vigeant  · 技术社区  · 15 年前

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


    100 25
    100 125
    -100
    -500

    如果 s

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

    4 回复  |  直到 12 年前
        1
  •  126
  •   terjetyl    15 年前

    你可以这样做

    public decimal FindDifference(decimal nr1, decimal nr2)
    {
      return Math.Abs(nr1 - nr2);
    }
    
        2
  •  33
  •   Martin    15 年前
    result = Math.Abs(value1 - value2);
    
        3
  •  27
  •   Mecki    5 年前

    只是加上这个,因为这里没有人写:

    你当然可以用

    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;
    

    *= -1 是的,它只是交换符号,因此它将为提供符号的CPU发出交换符号操作,而不是乘法,并且该操作的速度与CPU操作的速度一样快(通常为一个时钟周期)。

    第一个代码示例实际上与Abs在大多数实现中所做的一样,在支持的情况下使用“交换符号”,最后一个代码示例在没有“交换符号”的CPU上更快,并且乘法比加法更昂贵(在现代CPU上,它们通常同样快)。

        4
  •  5
  •   johnc    15 年前

    我认为这在C#中是不可能的,您可能需要考虑在汇编程序中实现它

        5
  •  1
  •   3263927 contra    4 年前

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