2011-11-23 13 views
23

Tengo el valor double como 12.256852651 y quiero mostrarlo como 12.257 como un número flotante sin convertirlo en un tipo de cadena.Redondeo de valores flotantes

¿Cómo puedo hacerlo en C#?

+2

Math.Round (valor, 3) http://msdn.microsoft.com/en-us/library/75ks3aby.aspx – FailedDev

+3

¿Qué quiere decir con "y no como un formato de cadena"? Está formateando el número como una cadena para mostrarlo, ¿verdad? –

+0

Quizás está pasando por el cable como un número (json, por ejemplo). Es posible que deba almacenarse como un lado del cliente número además de convertirse en una cadena para mostrar en una IU. Solo una conjetura basada en casos de uso similares aquí. –

Respuesta

41

Primero convertiría a Decimal y luego usaría Math.Round en el resultado. Esta conversión no es estrictamente necesaria, pero siempre me siento un poco incómodo si redondeo a decimales al usar puntos flotantes binarios.

Math.Round((Decimal)f, 3, MidpointRounding.AwayFromZero) 

También debe buscar en la elección de MidpointRounding, ya que por defecto utiliza esta ronda del banquero, que no es lo que estamos acostumbrados a la escuela.

+0

Recuerde, al redondear un tipo de punto flotante binario (en lugar de 'System.Decimal') a un número de decimales mayor que' 0', que típicamente el "punto medio" no es exactamente representable. Por ejemplo, el "punto medio" '12.2565' (el promedio de los vecinos' 12.256' y '12.257') no es exactamente representable como' doble' ya que su expansión binaria es infinita (periódica) (lo cual es muy frecuente). Entonces, hay una buena razón para tratar de convertir a 'decimal' antes del redondeo si uno quiere que se golpeen realmente los" puntos medios ". Con "doble" a menudo hay un "agujero" donde debería haber estado el punto medio. –

8

Si desea visualizarlo, será una cadena y eso es lo que debe usar.

Si desea redonda con el fin de utilizarla posteriormente en los cálculos, utilizar Math.Round((decimal)myDouble, 3).

Si no va a utilizar en el cálculo, pero necesidad de pantalla, usarlo double.ToString("F3").