2012-03-29 14 views
7

En C#, intento obtener los dos últimos lugares decimales de un doble sin redondeo. He intentado todo desde Math.Floor hasta Math.Truncate y nada funciona.Obtener los últimos dos lugares decimales sin redondeo

muestras de los resultados que me gustaría:

1,424.2488298 -> 1,424.24 
53.5821 -> 53.58 
10,209.2991 -> 10,209.29 

¿Alguna idea?

+1

Si eres haciendo trabajo en * decimal *, ¿por qué estás usando * doble * cuando podrías estar usando * decimal *? –

+0

Puede ir a esta publicación y encontrar lo que le conviene http://how-to-code-net.blogspot.ro/2012/09/how-to-format-number-to-x-decimal.html –

Respuesta

22

bien, matemáticamente es simple:

var f = 1.1234; 
f = Math.Truncate(f * 100)/100; // f == 1.12 

Mover el punto decimal dos lugares a la derecha, emitidos a un int para truncar, cambiar de nuevo a la izquierda dos lugares. Puede haber formas en el marco para hacerlo también, pero no puedo mirar ahora. Se podría generalizar:

double Truncate(double value, int places) 
{ 
    // not sure if you care to handle negative numbers...  
    var f = Math.Pow(10, places); 
    return Math.Truncate(value * f)/f; 
} 
+0

No es tan simple. Los dobles tienen un rango mayor que los puntos. – Joe

+0

@joe: Ahh, buen punto, use Math.Truncate en su lugar, no requiere conversión –

+0

@EdS. Intenté esto con el valor 136.2025 usando su primer método y lo cortó a 136.2 y se cayó 0. ¿Hay alguna manera de mantener el 0 en él? – mint

5
double d = Math.Truncate(d * 100)/100; 
2

Una solución general:

public static double SignificantTruncate(double num, int significantDigits) 
    { 
     double y = Math.Pow(10, significantDigits); 
     return Math.Truncate(num * y)/y; 
    } 

Entonces

double x = 5.3456; 
    x = SignificantTruncate(x,2); 

producirá el resultado deseado x=5.34.

14

Mi consejo: deja de usar double en primer lugar. Si necesita un redondeo decimal, entonces las probabilidades son buenas, debería usar decimal. ¿Cuál es tu aplicación?

Si usted tiene un doble, puede hacerlo de esta manera:

double r = whatever; 
decimal d = (decimal)r; 
decimal truncated = decimal.Truncate(d * 100m)/100m; 

Tenga en cuenta que esta técnica fallará si el valor absoluto de la doble es más grande que 792281625142643375935439504, debido a que la multiplicación por 100 fallará . Si necesita manejar valores tan grandes, entonces deberá usar técnicas especiales. (Por supuesto, en el momento en una doble es tan grande, que están mucho más allá de su capacidad para representar los valores con dos dígitos después de la coma decimal de todos modos.)

2
Math.Round(NumberToRound - (double)0.005,2) 

es decir

Math.Round(53.5821 - (double)0.005,2) // 53.58 
Math.Round(53.5899 - (double)0.005,2) // 53.58 
Math.Round(53.5800 - (double)0.005,2) // 53.58 
Cuestiones relacionadas