2014-02-11 34 views
0

嘿,我正在尝试WCF soap web服务的测试方法。WCF和不一致的双输入/输出

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

那么它是如何被改变还给过吗?

+0

您的问题通过询问_“什么是C#/ .NET中的double”的精度_,这在[小数点后的双精度](http:// stackoverflow。COM /问题/ 12089817 /精密的双-后小数点)。 – CodeCaster

回答

-1

从我读的双精度只有16位十进制数字。因此,尝试使用decimal代替double

当使用和不使用双重这里When should I use double instead of decimal?

+0

__double__没有固定的准确性:是不是基于十进制的数字表示。检查@Doug中的MSDN链接答案 – Askolein

+0

@Askolein它说:“所有浮点数的有效位数也是有限的,这也决定了浮点值接近实数的精确度。 15位精度的十进制数字,尽管内部最多保留17位数字。“ – ElectricRouge

+0

@ ElectricRouge3我明白你的观点。但这是一种内部表示精度,与数字本身的实际值不相关。粗略地说,它解释了基于double的“舍入”表示具有该精度限制。但几乎在所有情况下,真实精度都会远远低于此值。这是OP所经历的。 – Askolein

1

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

MSDN

正如小数无法精确地表示一些 分数值(如1/3或Math.PI),二进制小数是 不能代表一些分数值。例如,1/10,其中012作为小数部分精确地由.1表示,其被以.001100110011表示为二进制分数,模式“0011” 重复为无穷大。在这种情况下,浮点值提供了它所代表的数字的不精确表示。对原始的 浮点值执行附加的数学运算往往会增加精度的缺失。例如,如果我们将乘以0.1的结果与乘以0.1的乘法结果相比较,则我们看到该加法因为它有 涉及八个以上的操作,所以产生了不太精确的结果。 请注意,仅当我们通过使用“R”标准数字格式字符串显示两个Double 值(如果需要显示 显示Double 类型支持的精度的全部17位数字),这种不一致才会明显。