2013-04-07 3 views

Répondre

3

solution hackish pour arrondir

let round x d = 
    let rounded = Math.Round(x,d) 
    if rounded < x then x + Math.Pow(10,-d) else rounded 
+0

Cela fonctionne, merci. – user1934312

+1

Ergh, une branche si juste pour arrondir? Ajoutez la moitié de la précision requise puis tournez, sûrement! –

1

Pour arrondir (strictement, plutôt que de quelques pas de zéro):

let roundUp x d = 
    Math.Round(x + Math.pow(10,-d)/2,d) 

0,001 à l'arrondissement Envisager 2DP. Vous voulez que cela arrondir à 0,01:

0.001 + 0.01/2 = 0.006 
-> 2dp: 0.01 

Ceci est dérivé d'une manière commune pour obtenir l'arrondissement normal de troncature; pour ajouter la moitié de la précision nécessaire et tronquer. Ceci, cependant, souffre de nombres négatifs, donc le delta doit être soustrait ou ajouté en fonction du signe de la valeur d'origine.

Notez que si vous arrondissez toujours, les montants négatifs sont arrondis à zéro. Dans les situations financières où 2dp est habituellement nécessaire, c'est une mauvaise idée car un solde de 0,021 est arrondi à 0,03, mais un solde de -0,021 est arrondi à -0,02, et cela commence à compter si vous calculez un débit ou un crédit. . Si vous le faites symétriquement, par ex. toujours loin de zéro, alors tu ne t'en soucies plus.

+0

C'est même pire que ça - avec le comportement RoundToEven par défaut, certains nombres déjà arrondis sont instables. Par exemple, roundUp 1.05 2 produira 1.06. Vous devez utiliser MidPointRounding.AwayFromZero dans votre Round et vous assurer que vous arrondissez toujours les nombres négatifs. – Lamarth

Questions connexes