2010-11-03 6 views
2

Je comprends si .NET arrondit 2,5 à 2 en utilisant l'arrondissement des banquiers. Mais, comment cela pourrait être:Math.Round arrondit moi

decimal point; 
point =51 * 70/100;  
Math.Round(point,0, MidPointRounding.AwayFromZero); 

arrondit à 35?

Comment puis-je faire tous les .5 arrondi à l'entier supérieur, même si c'est impair?

Répondre

9

Vous effectuez une division entière. Essayez ceci à la place:

decimal point = 51m * 70m/100m; 
10

Cette deuxième ligne de votre extrait vous donne déjà un résultat entier. 51, 70, 100 sont de type int, donc les opérateurs pour la multiplication et la division entières sont choisis. Le résultat d'une multiplication ou d'une division entière est toujours de type entier et les décimales possibles sont tronquées lors de la division en utilisant / sur les entiers.

La déclaration point = 51 * 70/100; équivaut à

int tmp = 51 * 70;   // result is 3570 
tmp = tmp/100;   // result is 35 (!!!) 
point = (decimal)tmp;  // point is 35m; 

La solution est de changer votre code afin qu'il utilise decimal arithmétique:

point = 51m * 70m/100m; // point is 35.7m 

En fait, il suffit que un des opérandes est de type decimal. Cela peut être réalisé en utilisant le suffixe m (pour monétaire) ou en utilisant un cast de type. L'exemple suivant donnera également le résultat désiré:

point = (decimal)51 * 70/100; 
+0

Étrange, pourquoi est-ce nécessaire puisque OP utilise déjà Decimal? –

+2

@Peter van Kekem: 51, 70, 100 sont de type 'int', donc les opérateurs pour la multiplication et la division entières sont choisis. Le résultat d'une multiplication ou d'une division entière est toujours de type entier, et les décimales possibles sont tronquées lors de la division en utilisant '/' sur les entiers. –

+0

@Peter van Kekem: Parce que le calcul est fait sur les entiers avant d'être affecté à la décimale. C'est une ligne de code, mais ce n'est pas une opération. Les premiers entiers sont multipliés, ce qui donne un nombre entier, puis les entiers sont divisés en un nombre entier, puis le résultat est sauvegardé dans un nombre décimal (ce qui fonctionne bien car un nombre entier peut implicitement convertir un nombre décimal sans problème). La précision a été perdue avant d'arriver à la décimale. – David