Различие между 2 числами

63
задан S.L. Barth - Reinstate Monica 21 July 2012 в 07:58
поделиться

5 ответов

Можно сделать это как это

public decimal FindDifference(decimal nr1, decimal nr2)
{
  return Math.Abs(nr1 - nr2);
}
110
ответ дан terjetyl 24 November 2019 в 16:09
поделиться
result = Math.Abs(value1 - value2);
30
ответ дан Martin 24 November 2019 в 16:09
поделиться

Просто добавив это, поскольку никто не записал его здесь:

, В то время как можно, конечно, использовать

Math.Abs(number1 - number2);

, который является самым легким решением (и принятый ответ), интересно, никто не выписал, какой Брюшной пресс на самом деле делает. Вот решение, которое работает в Java, C, C# и любой язык с C как синтаксис :

int result = number1 - number2;
if (result < 0) {
    result *= -1;
}

Это настолько просто. Можно также записать его как это:

int result = number1 > number2 ? number1 - number2 : number2 - number1;

последний мог быть еще быстрее, как только он был скомпилирован; у обоих есть тот, если и одно вычитание, но первый имеет умножение в некоторых случаях, последнее, не имеет. Почему только в некоторых случаях? Некоторые центральные процессоры начинают "операцию" знака подкачки, и компилятор распознает то, что *= -1 делает, он просто подкачивает знак, таким образом, вместо умножения, он выпустит операцию знака подкачки для центральных процессоров, которые предлагают его, и эта операция состоит в том с такой скоростью, как операция ЦП может добраться (обычно один такт).

первый пример кода на самом деле делает, какой Брюшной пресс делает в большинстве реализаций для использования "знака подкачки", где поддерживается, последний будет быстрее на центральных процессорах, которые не имеют никакого "знака подкачки" и были умножением, являются более дорогими, чем дополнения (на современных центральных процессорах, они часто одинаково быстры).

21
ответ дан Mecki 24 November 2019 в 16:09
поделиться

Я не думаю, что это возможно в C#, Вы, возможно, должны посмотреть на реализацию его в Ассемблере

5
ответ дан johnc 24 November 2019 в 16:09
поделиться

Это - то, как я делаю это в проектах предприятия:

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

        }
    }
}
1
ответ дан 24 November 2019 в 16:09
поделиться
Другие вопросы по тегам:

Похожие вопросы: