嘿,我正在为WCF soap web服务尝试一种测试方法。
public Double TestDouble(Double x) { return x; }
测试工具只让我输入15位有效数字:
我可以使用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服务的输入似乎已收到正确的原始值:
那么在回馈之前它是如何被改变的呢?
答案 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?