我实际上有一个可能看起来很疯狂的问题,但是在WCF中我有一个简单的合同,有时当我在小数点上有DataContract时,服务会在"之后发回4位数。&#34 ;。我实际上期待只有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>
有谁知道为什么会这样?
答案 0 :(得分: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);
这会抛弃一些数据,所以如果精度实际上有意义,请小心(如上所述)。
如果仅用于演示目的,请考虑在显示屏中进行格式化。