2009-12-07 17 views
7

Sé por lectura this Stackoverflow question que el compilador mirará su número, decidirá si el punto medio es un número par o impar y luego devolverá el número par. El número de ejemplo fue 2.5, que se redondeó a 3. He intentado mis propios pequeños experimentos para ver qué sucede, pero todavía tengo que encontrar especificaciones sobre esto, o incluso si sería consistente entre los navegadores.¿Cuán cerca está el Math de Javascript.Round al C# Math.Round?

He aquí un fragmento de ejemplo Javascript usando jQuery para la pantalla:

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

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

Esto devuelve un '3'.

Lo que me gustaría saber es esto: ¿qué tan cerca está el redondeo en JavaScript al equivalente de C#? La razón por la que hago esto es porque me gustaría tomar un método JavaScript que usa Math.Round y volver a escribir el mismo método en C# y me gustaría saber que podría obtener los mismos resultados después de redondear un número.

Respuesta

5

Aquí es the complete javascript specification para Math.round(x):

15.8.2.15 round (x) Devuelve el valor numérico que es la más cercana a X y es igual a un número entero matemático. Si dos valores numéricos enteros son igualmente cerca de x, entonces el resultado es el valor numérico que está más cerca de + ∞. Si x ya es un número entero, el resultado es x.

  • Si x es NaN, el resultado es NaN.
  • Si x es +0, el resultado es +0.
  • Si x es -0, el resultado es -0.
  • Si x es + ∞, el resultado es + ∞.
  • Si x es -∞, el resultado es -∞.
  • Si x es mayor que 0 pero menor que 0.5, el resultado es +0.
  • Si x es menor que 0 pero mayor o igual que -0.5, el resultado es -0.

NOTA 1 Math.round (3.5) devuelve 4, pero Math.round (-3.5) devuelve -3.

NOTA 2 El valor de Math.round (x) es el mismo que el valor de Math.floor (x + 0.5), excepto cuando x es -0 o es menor que 0 pero mayor que o igual a -0.5; para estos casos Math.round (x) devuelve -0, pero Math.floor (x + 0.5) devuelve +0.

The C# Language Specification no estipula ningún algoritmo de redondeo en particular. Lo más parecido que tenemos es la documentación para .NET Math.Round. A partir de eso, puede ver que algunos de los casos de JavaScript no se aplican (Math.Round solo maneja decimales y dobles, no infinito), y las sobrecargas del método le dan mucho más control sobre el resultado - puede especificar el número de dígitos fraccionarios en el resultado y el método de redondeo del punto medio. De manera predeterminada, Math.Round usa 'redondeo bancario' (a par).

2

El redondeo de ECMAScript es básicamente ingenuo asymmetric rounding (con comprobaciones adicionales para +-Infinity). WRT portar su código JavaScript para C# usted está probablemente mejor evitar Math.Round de .NET (como es always symmetric) y utilizar en su lugar Math.Floor:

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

Es decir, si quieres estricta emulación de ECMAScript de Math.round.

+0

Tenías razón. Mire otra vez http://stackoverflow.com/questions/1870441/remove-all-attributes/1870487#1870487 – cletus

+0

En C#, debe usar Round con MidpointRounding.AwayFromZero para mantener contentos a los analistas y contables de su empresa. Parece que, por defecto, C# Round está utilizando el redondeo del banquero con MidpointRounding.Even. Y, por supuesto, en C# use Decimal por dinero. Sin embargo, no estoy seguro de cuán preciso será en Javascript, pero no debe confiar en Javascript de todos modos, el servidor es la autoridad. – JustAMartin