WCF和不一致的双输入/输出

时间:2014-02-11 19:09:54

标签: c# wcf

嘿,我正在为WCF soap web服务尝试一种测试方法。

public Double TestDouble(Double x) { return x; }

测试工具只让我输入15位有效数字:

enter image description here

我可以使用Soap UI添加更多数字,这里有17个有效数字:

   <soapenv:Header/>
   <soapenv:Body>
      <td:TestDouble>
         <!--Optional:-->
         <td:x>13.075815372878123</td:x>
      </td:TestDouble>
   </soapenv:Body>

一般来说,客户往往会抛出他们想要的许多无花果,所以这只是一个简单的测试,可以看到从服务中回来的一些不一致的数字。

结果也是17个数字但略高,所以输入与输出不匹配(应该是什么时候?):

   <s:Body>
      <TestDoubleResponse xmlns="http://ocdusrow3rndd1">
         <TestDoubleResult>13.075815372878124</TestDoubleResult>
      </TestDoubleResponse>
   </s:Body>

在调试模式下运行时,Web服务的输入似乎已收到正确的原始值:

enter image description here

那么在回馈之前它是如何被改变的呢?

2 个答案:

答案 0 :(得分:1)

double不存储确切的数字,而是存储近似值。因此,当再次显示该值时,所代表的数字可以改变最低有效数字。

来自MSDN

  

正如小数部分无法准确表示某些部分一样   小数值(例如1/3或Math.PI),二进制分数   无法表示某些小数值。例如,1/10,其中   精确表示.1表示小数部分   由.001100110011作为二进制分数,模式为“0011”   重复到无穷大。在这种情况下,浮点值提供   它所代表的数字的不精确表示。   对原件执行额外的数学运算   浮点值往往会增加其缺乏精确度。   例如,如果我们将.1乘以10的结果进行比较   添加.1到.1九次,我们看到添加,因为它有   涉及8个以上的操作,产生了不太精确的结果。   请注意,只有当我们显示两个Double时,这种差异才会显现   使用“R”标准数字格式字符串的值,如果   必需显示Double支持的所有17位精度   类型。

答案 1 :(得分:-1)

据我所知,双精度仅为16位十进制数。因此,请尝试使用decimal代替double

此处讨论何时使用和不使用double When should I use double instead of decimal?