2011-07-27 108 views
2

我正在使用现有的SQL Server数据库,并将表列定义为decimal(4,2)。但是,我被要求防止代码舍入小数位。从SQL Server数据库格式化十进制值

因此,我尝试将列类型更改为decimal,该列自动转换为decimal(18, 0),该列表立即清除了我现有值的任何小数部分。 (不错,默认的十进制类型是一个整数,有什么意义呢?)

所以我试着将列类型改为decimal(8,5)。由于小数点后的5位数字多于需要,因此消除了舍入问题。

但是,每当我在C#ASP.NET应用程序中打印此值时,它始终格式化为小数点后5位数(例如12.34000)。我不明白这一点。当我从数据库中读取值时,我将其分配给常规值decimal。那么decimal值如何知道小数点后面应该有5位数?

更重要的是,我怎样才能显示这个值没有尾随零?我猜测有一种方法来格式化值。但是,由于它在很多地方使用,如果它不会自动附加尾随零,它会更好。如果需要,我可以更改数据库中的数据类型。

回答

3

我将数据库列更改为float,并将C#变量类型设置为double

问题解决。

1

十进制将始终以零结尾。这是惯例 - 尾随零在那里显示有效位数。

就你而言,十进制(8,5)表示该数字总共有8位数,其中5位是小数点后的数字。

试试这个Select CAST (1 as decimal (8, 5))将返回1.00000

因为这意味着只有3位,小数点以下语句Select CAST (1000 as decimal (8, 5))会给你一个错误Arithmetic overflow error converting int to data type numeric.

+0

那么为什么你的第一个例子不会返回'00000001.00000'。这不会产生同样的感觉吗?我只是在这里使用了错误的数据类型? –

+0

@Jonathan Wood - 有效数字的约定在小数点后面,而不是在前面。 –

+0

好吧,那么不会返回'001.00000'与现在一样有意义吗? –

1

前试试这个小片段在一个控制台应用程序:

decimal d1 = 12.34M, d2 = 12.3400M; 

Console.WriteLine("{0} {1}", d1, d2); 
Console.WriteLine("{0:0.0###} {1:0.0###}", d1, d2); 

如果,如何以及在哪里可以应用格式取决于您。

+0

如果我将鼠标悬停在调试器中的十进制值上,它将显示“12.34”。如果这对于Visual Studio来说足够好,那么为什么没有更直接的方式来格式化呢?在程序中的任何地方找到显示的列并执行格式化字符串是有问题的。我使用了错误的数据类型吗? –

+0

关于数据类型:Float或Real将解决您的尾随零,但看看它们如何处理舍入。他们大约是类型。 –

+0

数据实际上代表了税率。所以它可能是6.625或14.25。看起来像十进制是第一位的矫枉过正,即使除了格式化问题。 –

2

您应该真的考虑在表示层中格式化货币,而不是数据层。 通常,您想要在十进制(10,18)字段中存储货币值。您可以检索十进制值并将其格式化为csharp中的表示形式,如str = String.Format(“{0:C}”,myDecimalValue);

+0

绝对如此。这就是为什么我的表示层想要根据内部表示对其进行格式设置是如此令人沮丧。所以这意味着我需要在几十个地方添加格式化代码。也许我使用了错误的数据类型。 “C”是货币的格式。这不是一种货币。 –