2014-02-11 60 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位數字),這種不一致纔會明顯。