2014-04-04 42 views
2

我實際上有一種可能看起來很瘋狂的問題,但在WCF中我有一個簡單的合同,有時當我有一個小數的DataContract時,服務在「。」後面發回4位數字。我實際上期待只有2位數字。這有可能嗎?WCF和DataContract:在「。」之後給出4位數的小數。有時只有2位

例如:

namespace MyContract.Data 
{ 
    [DataContract] 
    public class ClassB : ClassA 
    { 
     [DataMember] 
     public decimal VarA { get; set; } 

     [DataMember] 
     public decimal VarB { get; set; } 
    } 
} 

調用該服務後,我收到輸出是類似的東西:

<a:ClassB> 
    <a:VarA>47.34</a:VarA> 
    <a:VarB>23.1200</a:VarB> 
</a:ClassB> 

而且沒有人知道爲什麼出現這種情況?

回答

2

發生這種情況是因爲DataContractSerializer會簡單地序列化您的decimal,因爲他們自己想要表示。如果你做Console.Write或其他沒有指定格式的東西,你會得到相同的輸出。

原因是(可能是)23.12和23.1200之間的差異,即精度。我們假設這些值代表了您在實驗室中進行的一些測量。最後的零值意味着你已經精確地測量了這個值,你知道它不是23.1204或23.1211。但另一方面,23.12的精確度較低,可能是相同測量的結果,但是採用了不精確的儀器。

現在,這可能與您的具體用例無關。如果你有一個需要返回正是x數字,就可以串行化之前圓你小數:

ClassB b = // some initialization 
b.VarA = Decimal.Round(b.VarA, x); 
b.VarB = Decimal.Round(b.VarB, x); 

該扔掉了一些數據,雖然,所以要小心,如果精度實際上是有意義的(如上所述)。

如果這僅僅是爲了演示的目的,請考慮在顯示中進行格式設置。

+0

我會試一試。謝謝 – Nordes

相關問題