2009-12-07 6 views
7

Je sais en lisant this Stackoverflow question que le compilateur va regarder votre numéro, décider si le point milieu est un nombre pair ou impair et ensuite retourner le nombre pair. Le nombre d'exemples était de 2,5, arrondi à 3. J'ai essayé mes propres petites expériences pour voir ce qui se passe, mais je n'ai pas encore trouvé de spécifications à ce sujet, ou même si cela serait cohérent entre les navigateurs.À quelle distance est le Javascript Math.Round au C# Math.Round?

Voici un exemple d'extrait de code JavaScript en utilisant jQuery pour l'affichage:

$(document).ready(function() { 
    $("#answer").html(showRounding()); 
}); 

function showRounding() { 
    var answer = Math.round(2.5); 
    return answer; 
} 

Cela renvoie un '3'.

Ce que je voudrais savoir est ceci: À quel point l'arrondi en JavaScript est-il proche de l'équivalent en C#? La raison pour laquelle je fais cela est parce que je voudrais prendre une méthode JavaScript qui utilise Math.Round et réécrire la même méthode en C# et je voudrais savoir que je serais en mesure d'obtenir les mêmes résultats après avoir arrondi un nombre.

Répondre

5

est ici the complete javascript specification pour Math.round(x):

15.8.2.15 round (x) Renvoie la valeur numérique qui est le plus proche de x et est égal à un nombre entier mathématique. Si deux nombres entiers valeurs sont également près de x, le résultat est la valeur qui est plus proche de + ∞. Si x est déjà un nombre entier, le résultat est x.

  • Si x est NaN, le résultat est NaN.
  • Si x est +0, le résultat est +0.
  • Si x est -0, le résultat est -0.
  • Si x est + ∞, le résultat est + ∞.
  • Si x est -∞, le résultat est -∞.
  • Si x est supérieur à 0 mais inférieur à 0,5, le résultat est +0. Si 0 est inférieur à 0 mais supérieur ou égal à -0,5, le résultat est -0.

NOTE 1 Math.round (3.5) renvoie 4, mais Math.round (-3,5) renvoie -3.

NOTE 2 La valeur de Math.round (x) est la même que la valeur de Math.floor (x + 0,5), sauf lorsque X est -0 ou est inférieur à 0 mais supérieur ou égal à -0,5; pour ces cas Math.round (x) renvoie -0, mais Math.floor (x + 0.5) renvoie +0.

The C# Language Specification ne stipule aucun algorithme d'arrondissement particulier. La chose la plus proche que nous avons est la documentation pour Math.Round de .NET. De cela, vous pouvez voir que certains des cas javascript ne s'appliquent pas (Math.Round ne gère que les décimales et les doubles, pas l'infini), et les surcharges de la méthode vous donnent beaucoup plus de contrôle sur le résultat - vous pouvez spécifier le nombre de chiffres fractionnaires dans le résultat et la méthode d'arrondi à mi-parcours. Par défaut, Math.Round utilise l'arrondi des banquiers (pour égaliser).

2

L'arrondi d'ECMAScript est fondamentalement naïf asymmetric rounding (avec des contrôles supplémentaires pour +-Infinity). WRT portage de votre code JavaScript pour C# vous êtes probablement mieux éviter de Math.Round .NET (comme il est always symmetric) et utiliser à la place Math.Floor:

double d = -3.5d; 
double rounded = Math.Floor(d + 0.5); // -3 matches JavaScript's Math.round 

C'est, si vous voulez l'émulation stricte de ECMAScript de Math.round.

+0

Vous aviez raison. S'il vous plaît jeter un autre coup d'oeil http://stackoverflow.com/questions/1870441/remove-all-attributes/1870487#1870487 – cletus

+0

En C#, vous devriez utiliser Round avec MidpointRounding.AwayFromZero pour garder vos analystes d'affaires et les comptables heureux. Il semble que, par défaut, C# Round utilise l'arrondi du banquier avec MidpointRounding.Even. Et bien sûr, en C#, utilisez Decimal pour de l'argent. Je ne sais pas si cela sera exact dans Javascript, mais vous ne devriez pas compter sur Javascript de toute façon - le serveur est l'autorité. – JustAMartin