C# WCF和不一致的双输入/输出
嘿,我在尝试一个WCFSOAPWeb服务的测试方法C# WCF和不一致的双输入/输出,c#,wcf,C#,Wcf,嘿,我在尝试一个WCFSOAPWeb服务的测试方法 public Double TestDouble(Double x) { return x; } 测试工具仅允许我输入15位有效数字: 我可以使用Soap UI添加更多数字,下面是一个有17个有效数字的数字: <soapenv:Header/> <soapenv:Body> <td:TestDouble> <!--Optional:-->
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>
13.075815372878123
一般来说,客户机倾向于抛出他们想要的任何数量的sig图,所以这只是一个简单的测试,以查看从服务返回的一些不一致的数字
结果也是17位数,但略高一些,因此输入与输出不匹配(何时应该匹配?):
13.075815372878124
在调试模式下运行时,web服务的输入似乎收到了正确的原始值:
那么在返回之前它是如何被改变的呢?据我所知,double的精度只有16位小数。因此,尝试使用
decimal
而不是double
这里讨论了何时使用和不使用double
double
不存储准确的数字,而是存储近似值。因此,当再次显示该值时,所表示的数字可以更改最低有效数字
发件人:
正如小数不能精确地表示某些数字一样
分数值(如1/3或Math.PI),二进制分数为
无法表示某些分数值。例如,1/10
精确地表示为。1作为小数,表示为
以.001100110011作为二进制分数,模式为“0011”
无限重复。在这种情况下,浮点值提供
它所代表的数字的不精确表示。
对原始数据执行其他数学运算
浮点值往往会增加其精度的不足。
例如,如果我们将.1乘以10的结果与
将.1和.1相加九次,我们可以看到这个加法,因为它
涉及到八次以上的行动,产生了不太精确的结果。
请注意,只有当我们显示两个双精度
使用“R”标准数字格式字符串的值,如果
必要时显示双精度计数器支持的所有17位精度
类型
回答您的问题时,您会问“在C#/.NET中,
double
的精度是多少”,答案是。double没有固定的精度:is不是基于十进制的数字表示形式。检查@Doug中的MSDN链接answer@Askolein它说:“所有浮点数的有效位数也是有限的,这也决定了浮点数逼近实数的精度。双精度值的精度最高可达15位小数,但内部最多保留17位。”@我明白你的意思。但这是一种内部表示精度,而不是与数字本身的实际值相关联的精度。粗略地说,它解释了基于双精度的“四舍五入”表示具有该精度限制。但在几乎所有情况下,实际精度都远低于此。这就是OP所经历的。
<s:Body>
<TestDoubleResponse xmlns="http://ocdusrow3rndd1">
<TestDoubleResult>13.075815372878124</TestDoubleResult>
</TestDoubleResponse>
</s:Body>