【发布时间】:2012-02-09 01:45:46
【问题描述】:
这篇文章是关于将 .NET NaN 和无限值传递回 Excel 2010 VBA。
我使用不受我控制的 C# 方法(显然)可以返回 .NET NaN 或 Neg,Pos Infinity。 VBA 中的结果很奇怪(即比平时更奇怪),我想出的安全处理这种情况的唯一方法是不雅的三字符串比较 "-1.#IND" 或 "-1.#INF"或“1.#INF”。
有没有更好的办法?
如果你好奇的话,我已经在这里记录了奇怪的部分。 (示例是针对 NaN 的,但对于 pos 或 neg infinity 也是如此。)
double dVal = CSharpMethodReturningDouble() ' via .NET assembly / COM interop
variant vVal = CSharpMethodReturningDouble() ' via .NET assembly / COM interop
如果 C# 方法返回一个 double.NaN,那么我们有(在 immed 窗口中):
?dVal
-1.#IND
?vVal
-1.#IND
持有 NaN 的(盒装)变体对数字测试呈阳性,type = double
?IsNumeric(vVal)
True
?TypeName(vVal)
Double
对(盒装)变体 NaN 的比较有效,但结果与您期望的相反。 比较(未装箱的)双打导致溢出异常
?vVal=1 '<== NaN comparisons should always return false
True
?vVal=0 '<== that's not what you get with -1.#IND
True
?dVal=0 '<== strangely, the same comparison on the unboxed double fails
(OverFlow Exc)
对(盒装)变体的操作会导致溢出异常 对(未装箱)双打的操作(并按预期返回 -1.#IND)
?vVal * 1.1 '<== even stranger, for arith ops its the boxed value that fails
(Overflow Exc)
?dVal * 1.1 '<== but the operation on the unboxed double goes through
-1.#IND
IsError,IsNumeric 无济于事:
?IsError(vVal)
False
?IsError(dVal)
False
?IsNumeric(vVal)
True
?IsNumeric(dVal)
True
总是可以用字符串比较来测试:
?vVal = "-1.#IND"
True
?dVal = "-1.#IND"
True
【问题讨论】: