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?
Vous pouvez le faire comme ça
public decimal FindDifference(decimal nr1, decimal nr2)
{
return Math.Abs(nr1 - nr2);
}
result = Math.Abs(value1 - value2);
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).
Je ne pense pas que ce soit possible en C #, vous devrez peut-être envisager de l'implémenter dans Assembler