我有一个奇怪的问题。我试图将一个十进制变量分配给SAP Web服务。但是我的小数位超过限制时出现错误CX_SY_CONVERSION_LOST_DECIMALS
。
我使用Math.Round(Decimal, Int32) Method
解决了这个问题这是我的疑问。
i = 1.23450M;
j = Math.Round(i, 2); // 1.23M
(i!= j)== true,因为该值有差异
i = 1.000000M;
j = Math.Round(i, 2); // 1.00M
我可以将j
分配给网络服务中的字段,但不能i
。
现在i
和j
之间有什么区别?为什么会这样?
要获得WSDL的参考,请忽略主题。
<xsd:element name="MyVar" type="tns:curr15.2" />
<xsd:simpleType name="curr15.2">
<xsd:restriction base="xsd:decimal">
<xsd:totalDigits value="15" />
<xsd:fractionDigits value="2" />
</xsd:restriction>
</xsd:simpleType>
答案 0 :(得分:5)
现在i和j有什么区别?
i
有6位小数的精度; j
只有2.当然,差异根本不会改变数字的幅度 - i == j
仍会返回true
- 但是decimal
会保留小数位数,并且可能是您的网络服务客户端代码通知您指定的内容将超过保留。
缩放因子还会保留十进制数中的任何尾随零。尾随零不会影响算术或比较运算中的十进制数的值。但是,如果应用了适当的格式字符串,ToString方法可能会显示尾随零。
这是.NET中decimal
和float
/ double
之间的重大差异之一。