2011-07-27 140 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」是貨幣的格式。這不是一種貨幣。 –