Búsqueda de sitios web

C# - Problema de punto flotante en Javascript - ¿Problema de redondeo?


Tengo un problema con mi script del lado del cliente que no calcula los mismos valores que mi código del lado del servidor:

Por ejemplo:

var x = (2.85 * .1);
alert(x);

Esto da una cifra de 0.28500000000000003

Sin embargo, mi código del lado del servidor (C#) calcula una cifra de 0,285 que al redondearse a 2 decimales da 0,28

Si intento redondear 0.28500000000000003 a 2 decimales, obtengo 0.29.

¿Cómo hago para que mi Javascript cree una figura que coincida con mi código del lado del servidor?

Parece que tengo que pasar por 2 procesos de redondeo: primero para eliminar el 3 final, luego el redondeo a los lugares decimales requeridos.

Por ejemplo:

var x = 0.2850000000003;
x = parseFloat(x.toFixed(3))
x = x.toFixed(2)
alert(x);

¿Es este el mejor solución temporal?

(esto es una reformulación de una pregunta que abrí y eliminé antes)

Respuesta #1

.Net utiliza el redondeo del banquero. Si un número está en el punto medio de redondeo, por ejemplo 2,5, entonces el número se redondea al número par más cercano, en este caso 2. Redondear de esta manera elimina el sesgo introducido por redondear hacia arriba.

Puedes usar el redondeo de banquero en JavaScript usando el fragmento en http://snippets.dzone.com/posts/show/1305.

Respuesta #2

Tu código en C# está usando el tipo decimal base 10 que por defecto utiliza redondeo bancario. El código en Javascript utiliza aritmética de punto flotante en base 2. Estas dos formas de aritmética de computadora darán inherentemente resultados diferentes. La solución debe ser usar los mismos métodos aritméticos en ambos códigos.