我实际上有一个看起来很疯狂的问题,但在 WCF 中我有一个简单的契约(Contract),有时当我的 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>
有谁知道为什么会发生这种情况?
最佳答案
发生这种情况是因为 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);
不过,这会丢弃一些数据,因此如果精度实际上有意义(如上所述),请小心。
如果这仅用于演示目的,请考虑在显示中进行格式化。
关于c# - WCF 和数据契约 : Decimal giving 4 digits after the "." and sometimes only 2 digits,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22856339/