web-dev-qa-db-fra.com

Différence entre 2 nombres

J'ai besoin de l'algorithme parfait ou de la fonction C # pour calculer la différence (distance) entre 2 nombres décimaux.

Par exemple, la différence entre:
1 et 25 est 75
1 et - 25 est 125
- 1 et - 115 est 15
- 5 et 1 est 6

Existe-t-il une fonction C # ou un algorithme très élégant pour calculer cela ou je dois aller gérer chaque cas séparément avec si s.

S'il existe une telle fonction ou un tel algorithme, lequel est-ce?

62
Germstorm

Vous pouvez le faire comme ça

public decimal FindDifference(decimal nr1, decimal nr2)
{
  return Math.Abs(nr1 - nr2);
}
109
terjetyl
result = Math.Abs(value1 - value2);
30
Martin

J'ajoute simplement cela, car personne ne l'a écrit ici:

Bien que vous puissiez sûrement utiliser

Math.Abs(number1 - number2);

qui est la solution la plus simple (et la réponse acceptée), je me demande si personne n'a écrit ce que fait réellement Abs. Voici une solution qui fonctionne en Java, C, C # et tous les autres langages avec une syntaxe de type C:

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

C'est si simple. Vous pouvez également l'écrire comme ceci:

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

Le dernier pourrait être encore plus rapide une fois compilé; les deux ont une soustraction si et une, mais la première a une multiplication dans certains cas, la dernière n'en a pas. Pourquoi seulement dans certains cas? Certains processeurs ont une opération "swap sign" et le compilateur reconnaît ce que *= -1 le fait, il échange simplement le signe, donc au lieu d'une multiplication, il émettra une opération de signe d'échange pour les processeurs qui le proposent et cette opération est aussi rapide qu'une opération de processeur peut obtenir (généralement un cycle d'horloge).

Le premier exemple de code fait en fait ce que fait Abs dans la plupart des implémentations pour utiliser le "signe de swap" là où il est pris en charge, le dernier sera plus rapide sur les CPU qui n'ont pas de "signe de swap" et où les multiplications sont plus chères que les ajouts (sur processeurs modernes, ils sont souvent tout aussi rapides).

21
Mecki

Je ne pense pas que ce soit possible en C #, vous devrez peut-être envisager de l'implémenter dans Assembler

5
johnc