为什么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分配给该字段。那么ij有什么区别呢?为什么会这样呢?

对于来自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>

为什么c#中的小数1.00M和1.000000M不同?

i和j的区别是什么?

i的精度为小数点后六位;j只有2个。当然,这个差异根本不会改变数字的大小——而且i == j仍然会返回true——但是decimal保留了小数点后的位数,并且您的web服务客户端代码可能会注意到您指定的位数比保留的要多。

来自文档:

比例因子还保留十进制数中任何尾随的零。在算术或比较运算中,末尾的零不会影响十进制数的值。但是,如果应用了适当的格式字符串,ToString方法可能会显示尾随的零。

这是。net中decimalfloat/double的显著区别之一。