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

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:-->

嘿,我在尝试一个WCFSOAPWeb服务的测试方法

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>