El tipo de datos SQL Server money
internamente es un entero de 64 bits con una escala implícita de 4 posiciones decimales. Para citar Books Online, es exacto "a diez milésimas de una unidad monetaria". Es, el equivalente aproximado de decimal(19,4)
.
El motivo de la escala de 4 en lugar de 2 es mantener la precisión en los resultados de la aritmética. Su valor de moneda ordinaria tiene una escala de 2 (por ejemplo, $ 3,27) La multiplicación o división de dos números con una escala de 2 decimales da un resultado que es preciso para 4 decimales: 9.23 dividido por 3.27 produce un resultado de 2.82262996941896 (aproximadamente). Puede llevar el resultado a cualquier precisión (número de decimales) que desee. Sin embargo, el resultado es solo preciso a 4 decimales (2.8226) ya que los valores originales solo tenían una precisión de 2 decimales. Esa medida es precisa hasta dentro de 1/2 de la unidad más pequeña especificada (+/- 0.005).
Pero estoy divagando.
Como resultado de un valor de SQL Server money
con una escala implícita de 4, ADO.Net convierte el valor a System.Decimal con una escala de 4. Y dado que System.Decimal rastrea la escala, cuando la convierte a cadena, obtienes 4 decimales.
Para obtener menos, puede
- redonda que antes de la conversión, utilizando la apropiada sobrecarga
Decimal.Round()
o
- formato como desee (por ejemplo.
(3.27M).ToString("0.00") ;
.
Espero que esto ayude.
Este programa:
namespace Sandbox
{
using System ;
class Program
{
static void Main(string[] args)
{
decimal pi = (decimal) Math.PI ;
string piText = pi.ToString("0.00");
Console.WriteLine("PI to 2 decimal places is {0} one way, and {1:0.00} another" , piText , pi) ;
return;
}
}
}
produce lo que se espera:
PI to 2 decimal places is 3.14 one way, and 3.14 another
Cheers,
N.
¿Estoy usando decimal? y ToString ("0:00) no se puede usar con él – DotnetSparrow
Alguien debería decirle eso al tiempo de ejecución de .Net. Vea el ejemplo en mi respuesta original. –
Los dores de formateo no funcionan en los componentes de DevExpress. Que están llenos de errores como este BTW. – f470071