2014-02-05 38 views
2

我有一個我從未見過的案例。.NET十進制格式根據來源不同而不同

在一種情況下,我們通過代碼分配一個十進制值,例如,值foo.DecimalField = 200M; 當我ToString()這個沒有格式化或者文化,我得到的值"200"

在另一種情況下,當相同的字段是從的EntityFramework分配,調試器仍然表示,該領域的精確值200M,但當ToString()'它,它會產生"200.00"

我會得到,如果這是一個浮點問題,或者如果在調試器中有隱藏的小數。

但是由於我使用了一個固定點十進制類型,這怎麼可能? 沒有網絡服務器或任何可能影響文化或涉及的東西。

我錯過了什麼? 可以小數型運作方式,取決於它如何被初始化(我假設有一些讀者從EF獲取它時,內部是inits十進制)

+1

也許你可以創建一個SSCCE –

+0

'decimal'仍然是一個浮點類型,它只是十進制而不是二進制。 – dreamlax

+1

當您對它們執行操作時,十進制數保持其精度,因此如果通過具有不同精度的計算得到了兩個數字,則這是預期的行爲。 –

回答

3

不像DoubleDecimal保持零,例如

Decimal d0 = 200M; 
    Decimal d1 = 200.0M; 
    Decimal d2 = 200.00M; 

    // 200 
    String St0 = d0.ToString(); 
    // 200.0 (or 200,0 depending on CultureInfo.CurrentCulture) 
    String St1 = d1.ToString(); 
    // 200.00 
    String St2 = d2.ToString(); 

如此看來,在計算的過程中,數據庫讀取等一個價值似乎是200M而其他200.00M

+1

這篇「文章」也提供了一些洞察力:http://csharpindepth.com /Articles/General/Decimal.aspx(簡而言之,指數是存儲的,因此它「知道」小數) – flindeberg

相關問題