Duplicar posible:
c# - How do I round a decimal value to 2 decimal places (for output on a page)número Truncar decimal no redondear
quiero truncar los decimales, como a continuación
es decir
- 2,22939393 -> 2.229
- 2,22977777 -> 2,229
Duplicar posible:
c# - How do I round a decimal value to 2 decimal places (for output on a page)número Truncar decimal no redondear
quiero truncar los decimales, como a continuación
es decir
double d = 2.22977777;
d = ((double) ((int) (d * 1000.0)))/1000.0 ;
Por supuesto, esto no va a funcionar si usted está tratando de truncar error de redondeo, pero debería funcionar bien con los valores que das en tus ejemplos. Consulte las dos primeras respuestas al this question para obtener detalles sobre por qué a veces no funcionará.
wow todo eso solo para acortar un número. –
Parece mucho, pero está haciendo mucho menos trabajo que convertirlo en una cadena. :) –
es una forma más correcta también. –
Puede utilizar Math.Round:
decimal rounded = Math.Round(2.22939393, 3); //Returns 2.229
O puede utilizar ToString con la N3 numeric format.
string roundedNumber = number.ToString("N3");
EDIT: Puesto que usted no desea redondeo, puede utilizar simplemente Math.Truncate:
Math.Truncate(2.22977777 * 1000)/1000; //Returns 2.229
No funciona con el segundo ejemplo. Solo quiero que se trunque - no se redondea. –
+1 para Math.Truncate – Peter
Solo para reiterar: +1 para Math.Truncate, -1 para Math.Round, que no resuelve la pregunta. –
¿Qué formato quieres obtener?
Si usted es feliz con una cadena a continuación, consideremos el siguiente código C#:
double num = 3.12345;
num.ToString("G3");
El resultado será "3,12".
Este enlace puede ser útil si usa .NET. http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx
Yo espero que ayude .... pero a menos que se identifica que el lenguaje que está utilizando y el formato en el que desea que la salida es difícil sugerir una solución adecuada.
Esto no ayuda al OP porque redondea los dígitos, en lugar de truncar. Además, el especificador de precisión para el formato '" G "' es para el número total de dígitos, no solo los decimales (que es lo que '' F "' hace) – sinelaw
Prueba esto:
decimal original = GetSomeDecimal(); // 22222.22939393
int number1 = (int)original; // contains only integer value of origina number
decimal temporary = original - number1; // contains only decimal value of original number
int decimalPlaces = GetDecimalPlaces(); // 3
temporary *= (Math.Pow(10, decimalPlaces)); // moves some decimal places to integer
temporary = (int)temporary; // removes all decimal places
temporary /= (Math.Pow(10, decimalPlaces)); // moves integer back to decimal places
decimal result = original + temporary; // add integer and decimal places together
Se puede writen más corto, pero esto es más descriptivo.
EDIT: forma corta:
decimal original = GetSomeDecimal(); // 22222.22939393
int decimalPlaces = GetDecimalPlaces(); // 3
decimal result = ((int)original) + (((int)(original * Math.Pow(10, decimalPlaces))/(Math.Pow(10, decimalPlaces));
Puede ser porque no compila. ¿En qué idioma estabas desarrollando? Intenté esto en C# justo ahora y me da un error al tratar de multiplicar un decimal por un doble. –
Quizás otra solución rápida podría ser:
>>> float("%.1f" % 1.00001)
1.0
>>> float("%.3f" % 1.23001)
1.23
>>> float("%.5f" % 1.23001)
1.23001
olvido de todo sólo echa un vistazo a este
double num = 2.22939393;
num = Convert.ToDouble(num.ToString("#0.000"));
Esto está mal. La publicación original está buscando truncar. Esto será redondo. 2.2296 dará como resultado 2.23. –
Una función para truncar una número arbitrario de decimales:
public decimal Truncate(decimal number, int digits)
{
decimal stepper = (decimal)(Math.Pow(10.0, (double)digits));
int temp = (int)(stepper * number);
return (decimal)temp/stepper;
}
Esto falla en números grandes con 'System.OverflowException: el valor era demasiado grande o demasiado pequeño para un Int32' – sinelaw
Aquí hay un método de extensión que no sufre desbordamiento de enteros (como lo hacen algunas de las respuestas anteriores). También almacena algunos poderes de 10 para mayor eficiencia.
static double[] pow10 = { 1e0, 1e1, 1e2, 1e3, 1e4, 1e5, 1e6, 1e7, 1e8, 1e9, 1e10 };
public static double Truncate(this double x, int precision)
{
if (precision < 0)
throw new ArgumentException();
if (precision == 0)
return Math.Truncate(x);
double m = precision >= pow10.Length ? Math.Pow(10, precision) : pow10[precision];
return Math.Truncate(x * m)/m;
}
Prueba este
double d = 2.22912312515;
int demention = 3;
double truncate = Math.Truncate(d) + Math.Truncate((d - Math.Truncate(d)) * Math.Pow(10.0, demention))/Math.Pow(10.0, demention);
Esto es similar a TCKs sugerencia anterior, pero utilizando en lugar de las conversiones Math.Truncate int
VB: pero usted consigue la idea
Private Function TruncateToDecimalPlace(byval ToTruncate as decimal, byval DecimalPlaces as integer) as double
dim power as decimal = Math.Pow(10, decimalplaces)
return math.truncate(totruncate * power)/power
end function
Pregunta relacionada: http://stackoverflow.com/questions/304011/truncate-a-decimal-value-in-c – strager
Creo que el culo embly instruction .trn hará esto por usted también. –
La pregunta duplicada no dice nada acerca de redondear sin truncar. Aunque similar, los aspectos clave de esta pregunta (no redondear) no son respondidos correctamente por el "duplicado". Votando para reabrir – psubsee2003