Pregunta ¿Cómo redondeo un valor decimal a 2 decimales (para salida en una página)


Al mostrar el valor de un decimal actualmente con .ToString(), es preciso tener 15 posiciones decimales, y como lo estoy usando para representar dólares y centavos, solo quiero que la salida sea de 2 decimales.

¿Utilizo una variación de .ToString() ¿para esto?


521
2017-10-02 22:41


origen


Respuestas:


decimalVar.ToString ("#.##"); // returns "" when decimalVar == 0

o

decimalVar.ToString ("0.##"); // returns "0"  when decimalVar == 0

731
2017-10-02 22:43



Sé que esta es una vieja pregunta, pero me sorprendió ver que nadie parecía publicar una respuesta;

  1. No usé el redondeo de banqueros
  2. No mantuvo el valor como un decimal.

Esto es lo que usaría:

decimal.Round(yourValue, 2, MidpointRounding.AwayFromZero);

http://msdn.microsoft.com/en-us/library/9s0xa85y.aspx


508
2018-04-20 01:16



decimalVar.ToString("F");

Esta voluntad:

  • Redondea a 2 lugares decimales, por ej. 23.456 => 23.46
  • Asegúrate de que haya son siempre 2 decimales, por ej. 23 => 23.00, 12.5 => 12.50

Ideal para moneda y mostrar montos monetarios.

Para documentación sobre ToString ("F"): http://msdn.microsoft.com/en-us/library/dwhawy9k%28v=vs.110%29.aspx#FFormatString (con agradecimiento a Jon Schneider)


274
2017-12-15 14:29



Si solo necesita esto para mostrar, use cadena.Formato

String.Format("{0:0.00}", 123.4567m);      // "123.46"

http://www.csharp-examples.net/string-format-double/

La "m" es un sufijo decimal. Acerca del sufijo decimal:

http://msdn.microsoft.com/en-us/library/364x0z75.aspx


92
2017-10-02 22:43



Dado decimal d = 12.345; las expresiones d.ToString ("C") o String.Format ("{0: C}", d) rendimiento $ 12.35 - tenga en cuenta que se utilizan las configuraciones de moneda de la cultura actual, incluido el símbolo.

Tenga en cuenta que "DO" usa la cantidad de dígitos de la cultura actual. Siempre puede anular el valor predeterminado para forzar la precisión necesaria con C{Precision specifier} me gusta String.Format("{0:C2}", 5.123d).


53
2017-10-02 22:58



Si lo quiere formatear con comas y un punto decimal (pero sin símbolo de moneda), como 3,456,789.12 ...

decimalVar.ToString("n2");

40
2018-04-21 23:20



Ya hay dos respuestas de puntuación alta que se refieren a Decimal.Round (...) pero creo que se necesita un poco más de explicación, porque hay una propiedad importante e inesperada de Decimal que no es obvia.

Un decimal "sabe" cuántos decimales tiene en función de su origen.

Por ejemplo, lo siguiente puede ser inesperado:

Decimal.Parse("25").ToString()          =>   "25"
Decimal.Parse("25.").ToString()         =>   "25"
Decimal.Parse("25.0").ToString()        =>   "25.0"
Decimal.Parse("25.0000").ToString()     =>   "25.0000"

25m.ToString()                          =>   "25"
25.000m.ToString()                      =>   "25.000"

Haciendo las mismas operaciones con Double no dará decimales ("25") para cada uno de los anteriores.

Cuando quiere un decimal con dos decimales, hay un 95% de probabilidad de que sea porque es moneda, en cuyo caso probablemente esté bien el 95% del tiempo:

Decimal.Parse("25.0").ToString("c")     =>   "$25.00"

O en XAML solo usas {Binding Price, StringFormat=c}

En un caso me encontré con que necesitaba un decimal AS como un decimal cuando enviaba XML al servicio web de Amazon. El servicio se quejaba porque se enviaba un valor decimal (originalmente de SQL Server) como 25.1200 y rechazado, (25.12 era el formato esperado).

Todo lo que tenía que hacer era Decimal.Round(...) con 2 decimales para solucionar el problema.

 // This is an XML message - with generated code by XSD.exe
 StandardPrice = new OverrideCurrencyAmount()
 {
       TypedValue = Decimal.Round(product.StandardPrice, 2),
       currency = "USD"
 }

TypedValue es de tipo Decimal entonces no podría simplemente hacer ToString("N2") y necesitaba redondearlo y mantenerlo como una decimal.


26
2017-10-26 07:30



Aquí hay un pequeño programa de Linqpad para mostrar diferentes formatos:

void Main()
{
    FormatDecimal(2345.94742M);
    FormatDecimal(43M);
    FormatDecimal(0M);
    FormatDecimal(0.007M);
}

public void FormatDecimal(decimal val)
{
    Console.WriteLine("ToString: {0}", val);
    Console.WriteLine("c: {0:c}", val);
    Console.WriteLine("0.00: {0:0.00}", val);
    Console.WriteLine("0.##: {0:0.##}", val);
    Console.WriteLine("===================");
}

Aquí están los resultados:

ToString: 2345.94742
c: $2,345.95
0.00: 2345.95
0.##: 2345.95
===================
ToString: 43
c: $43.00
0.00: 43.00
0.##: 43
===================
ToString: 0
c: $0.00
0.00: 0.00
0.##: 0
===================
ToString: 0.007
c: $0.01
0.00: 0.01
0.##: 0.01
===================

18
2017-11-18 20:44



Math.Round Method (Decimal, Int32)


14
2017-10-02 22:44



Ninguno de estos hizo exactamente lo que necesitaba, para forzar 2 d.p. y redondear como 0.005 -> 0.01

Forzando 2 d.p. requiere aumentar la precisión en 2 d.p. para asegurar que tenemos al menos 2 d.p.

luego redondeando para asegurar que no tengamos más de 2 d.p.

Math.Round(exactResult * 1.00m, 2, MidpointRounding.AwayFromZero)

6.665m.ToString() -> "6.67"

6.6m.ToString() -> "6.60"

9
2017-10-25 14:35



Puede usar system.globalization para formatear un número en cualquier formato requerido.

Por ejemplo: 

system.globalization.cultureinfo ci = new system.globalization.cultureinfo("en-ca");

Si tienes un decimal d = 1.2300000 y necesita recortarlo a 2 decimales, entonces se puede imprimir así d.Tostring("F2",ci); donde F2 está formateando cadenas a 2 decimales y ci es la configuración regional o cultureinfo.

para más información, consulte este enlace
http://msdn.microsoft.com/en-us/library/dwhawy9k.aspx


7
2017-08-23 00:15