为什么c#中的小数1.00M和1.000000M不同?
本文关键字:000000M 不同 00M 为什么 小数 | 更新日期: 2023-09-27 17:49:47
我遇到了一个奇怪的问题。我尝试为SAP web服务分配一个十进制变量。但是我得到了错误CX_SY_CONVERSION_LOST_DECIMALS
因为小数点超过了极限。
我用数学解决了它。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
分配给web service中的字段,但不能将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>
i和j的区别是什么?
i
的精度为小数点后六位;j
只有2个。当然,这个差异根本不会改变数字的大小——而且i == j
仍然会返回true
——但是decimal
保留了小数点后的位数,并且您的web服务客户端代码可能会注意到您指定的位数比保留的要多。
来自文档:
比例因子还保留十进制数中任何尾随的零。在算术或比较运算中,末尾的零不会影响十进制数的值。但是,如果应用了适当的格式字符串,ToString方法可能会显示尾随的零。
这是。net中decimal
和float
/double
的显著区别之一。