2009-12-07 3 views
7

So dalla lettura dello this Stackoverflow question che il compilatore guarderà il tuo numero, deciderà se il punto medio è un numero pari o dispari e quindi restituirà il numero pari. Il numero di esempio era 2.5, arrotondato a 3. Ho provato i miei piccoli esperimenti per vedere cosa succede, ma non ho ancora trovato alcuna specifica su questo, o anche se sarebbe coerente tra i browser.How Close è il file JavaScript Math.Round in C# Math.Round?

Ecco un esempio frammento di JavaScript utilizzando jQuery per il display:

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

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

Questo restituisce un '3'.

Quello che vorrei sapere è questo: quanto è vicino l'arrotondamento in JavaScript all'equivalente C#? La ragione per cui sto facendo questo è che vorrei prendere un metodo JavaScript che utilizza Math.Round e riscrivere lo stesso metodo in C# e vorrei sapere che sarei in grado di ottenere gli stessi risultati dopo aver arrotondato un numero.

risposta

5

Ecco the complete javascript specification per Math.round(x):

15.8.2.15 round (x) Restituisce il valore numero che è più vicino a x ed è pari ad un intero matematica. Se due valori Numero intero sono ugualmente vicino a x, il risultato è il valore Numero più vicino a + ∞. Se x è già un numero intero, il risultato è x.

  • Se x è NaN, il risultato è NaN.
  • Se x è +0, il risultato è +0.
  • Se x è -0, il risultato è -0.
  • Se x è + ∞, il risultato è + ∞.
  • Se x è -∞, il risultato è -∞.
  • Se x è maggiore di 0 ma minore di 0,5, il risultato è +0.
  • Se x è minore di 0 ma maggiore o uguale a -0.5, il risultato è -0.

NOTA 1 Math.round (3,5) restituisce 4, ma Math.round (-3,5) restituisce -3.

NOTA 2 Il valore di Math.round (x) è uguale al valore di Math.floor (x + 0,5), tranne quando x è -0 o è minore di 0 ma maggiore o uguale a -0,5; per questi casi Math.round (x) restituisce -0, ma Math.floor (x + 0.5) restituisce +0.

The C# Language Specification non stabilisce alcun algoritmo di arrotondamento particolare. La cosa più vicina che abbiamo è la documentazione per .NET Math.Round. Da ciò, si può vedere che alcuni dei casi di javascript non si applicano (Math.Round gestisce solo decimali e raddoppia, non infinito) e gli overload del metodo danno un maggiore controllo sul risultato - è possibile specificare il numero di cifre frazionarie nel risultato e nel metodo di arrotondamento del punto medio. Per impostazione predefinita, Math.Round utilizza l'arrotondamento del banco (fino a pari).

2

L'arrotondamento di ECMAScript è sostanzialmente ingenuo asymmetric rounding (con controlli aggiuntivi per +-Infinity). WRT porting il codice JavaScript per C# si sta probabilmente meglio evitare di Math.Round NET (come è always symmetric) e utilizzare invece Math.Floor:

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

Cioè, se si vuole rigorosa l'emulazione di ECMAScript di Math.round.

+0

Avevi ragione. Si prega di dare un altro sguardo http://stackoverflow.com/questions/1870441/remove-all-attributes/1870487#1870487 – cletus

+0

In C#, si dovrebbe utilizzare Round con MidpointRounding.AwayFromZero per mantenere felici i vostri analisti e contabili. A quanto pare, C# Round utilizza l'arrotondamento del banchiere con MidpointRounding.Even. E naturalmente, in C# usa Decimal per soldi. Non sono sicuro, tuttavia, quanto sia accurato in Javascript, ma non dovresti comunque fare affidamento su Javascript: il server è l'autorità. – JustAMartin