2014-02-05 29 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

相关问题