2015-11-18 61 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设置前:

相关问题