2015-11-18 68 views
1

我有一個Convert.ToDecimal()偶爾拋出一個異常與消息我該如何處理這個double.NaN

價值要麼過大或過小的十進制

,因爲致電DataContainer.GetValue(ColKeyId, index)返回double.NaN。我不能更改GetValue()的API實現調用。 處理轉換爲NaN double的十進制數的最佳方法是什麼?

+0

如果可以的話,添加'TryGetValue',如果可能的話''DataContainer''將返回'bool'和'out'的結果。如果這不可能,那就去'try' /'catch' – Alireza

+0

那麼當結果是NaN時,你希望發生什麼?實現將非常簡單,但你需要確定你想要做什麼。 (請注意,你應該考慮積極和消極的無限......) –

+0

@Jon。當結果是NaN時,我希望能夠和Cal SetValue – Nostradamus

回答

3

好了,這聽起來像你只需要檢測是否是NaN值:

double value = DataContainer.GetValue(ColKeyId, index); 
if (double.IsNaN(value) || double.IsInfinity(value) || 
    (decimal) value != (decimal) newValueToSet) 
{ 
    DataContainer.SetValue(ColKeyId, index, newValueToSet); 
} 

說實話,你爲什麼從double轉換到目前還不清楚完全可以使用decimal,但這段代碼至少說明了如何檢測NaN /無限值。請注意,我已經改變了呼叫Convert.ToDecimal簡單的鑄件,使代碼更簡單 - 但你可以使用Convert.ToDecimal如果你願意,當然..

+0

Jon,在我看來,像'(十進制)值!=(十進制)newValueToSet'是一個很奇怪的檢查 - 如果你得到舍入誤差(十進制是128位,double是64位)東西了吧?除此之外,這也是我的想法...... – atlaste

+0

@atlaste:是的,我同意這很奇怪 - 但這就是問題所在。我沒有引入怪異,只是將它的形式從'Convert.ToDecimal'調用轉換爲強制轉換。 –

+0

Jon,真的;在我看來,好像不是簡單地複製他的壞習慣,而是解釋它有什麼問題。 :-)無論如何,我們只希望他能夠理解我的評論;你的回答是正確的。 – atlaste

0

Decimal.TryParse

,那麼你就會知道,如果它轉換與否,如果沒有一個assigne值defasult或岔開了一些其他的途徑。

HTH

+0

否,因爲TryParse(字符串,十進制)。我有一個雙精度型轉換爲十進制。與字符串無關 – Nostradamus

0

您可以檢查是否值double.NaN設置前:

相關問題