2011-11-22 10 views
8

Sto usando la funzione ROUND da C# e SQL, e sorprendentemente entrambi stanno dando risultati diversi.Perché le funzioni C# round e SQL round producono risultati diversi?

In SQL: ROUND(1250.00, -2) = 1300

In C# ROUND 1250 con rotondo e precision = 2 = 1200

Qualcuno ha imbattuto in questa situazione prima?

+0

quale server di database stai usando ?? – Baz1nga

+0

Si tratta del modo in cui le lingue arrotondano i numeri. Il tuo SQL ovviamente arrotonda UP e C# arrotonda GIÙ quando sei nel mezzo. Suggerisco di provare a usare qualcosa di diverso da ROUND. Il ceiling in SQL va a ruba, ma senza ulteriori informazioni su ciò che stai cercando di fare è davvero impossibile dare consigli su cosa usare. –

+0

Per chiarire, C# non arrotonda i numeri; fa .NET BCL. –

risposta

7

C# utilizza l'arrotondamento del banchiere per impostazione predefinita, dove quando si è esattamente sul segno .5, si arrotonda al numero pari più vicino invece di arrotondare per eccesso.

La sezione commenti del messaggio msgn article descrive questo comportamento. Fondamentalmente è per ridurre gli errori di arrotondamento quando si accumulano un sacco di numeri arrotondati insieme.

0

Utilizzare il parametro su Math.Round, MidpointRounding, per specificare il metodo per arrotondare i numeri.

public enum MidpointRounding 
{ 
    // When a number is halfway between two others, it is rounded toward 
    // the nearest even number. 
    ToEven = 0, 

    // When a number is halfway between two others, it is rounded toward 
    // the nearest number that is away from zero. 
    AwayFromZero = 1, 
} 

Si può usare in questo modo:

int presicion = 2; 
double valueToRound; 

Math.Round(valueToRound/Math.Pow(10, precision), MidpointRounding.AwayFromZero) 
    * Math.Pow(10, precision); 
+0

Ho provato con questo parametro ma non lo uso. Sempre lo stesso risultato :( –

1

La parte difficile di arrotondamento è cosa fare con 5 di in decimale. In realtà sono esattamente a metà strada, quindi costituiscono un pareggio. C'è un bel po 'di tie-breaking nell'articolo di arrotondamento di Wikipedia. In sostanza, C# utilizza l'arrotondamento del banchiere che si arrotonda quando l'ultima cifra non divisa è pari o superiore quando è dispari. Questo è in linea con lo standard IEEE. SQL invece segue la regola "sempre round 5 su".

3

se leggete http://msdn.microsoft.com/en-us/library/wyk4d9cy.aspx, vedrete che l'arrotondamento di default è "rotonda per addirittura" (banchiere di arrotondamento) dove, come SQL Server sembra essere l'utilizzo di "standard" arrotondamento

aggiornamento di SQL Server O fa Symmetric aritmetica arrotondamento o Symmetric arrotondato per difetto (Fix) a seconda argomenti

come risolvere il problema: implementare una procedura di arrotondamento personalizzato: http://support.microsoft.com/default.aspx?scid=KB;EN-US;Q196652&ID=KB;EN-US;Q196652

+0

Il link di supporto non funziona più Esiste un'implementazione dell'arrotondamento di Banker in SQL [qui] (http://blogs.lessthandot.com/index.php/datamgmt/datadesign/sql -server-arrotondamento metodi /) –