我有这个等式:
val2 = ((((((((((Math.Pow(((previous_val) + (val5*100)), 1.001)) / 24) / 60) / 60) * 100) / 3600)*h)/m)*s));
previous_val
和val5
是与其他值相等的局部变量。变量h
,m
和s
代表小时,分钟和秒。
我的问题:当m
和s
都等于0时,我得到NaN
而不是我的答案。
NaN
和h
相当于0时,也实现了m
。
我应该在我的代码中添加什么才会引发异常?我确信这个'不是数字'“错误”的原因是我将其除以零。
答案 0 :(得分:5)
NaN易于生产:
float f = 0.0f / 0; // NaN (note use of fp operand to promote / to fp)
float g = f + 42; // NaN
h
,m
和s
中的零如何/可以导致这种情况?请记住,一旦引入了NaN
,它就会在大多数情况下无声地传播。 (正如其他人所建议的那样,将问题分解成更小的一小部分将有助于调试 - 以及未来的可维护性; - )
虽然最后(或中间)IsNaN
检查可以检测方案,但也可以考虑检查/对非法输入做出反应。 (我不确定是否有办法在C#中获取[罕见] 信令NaN ,这与观察到的安静NaN 不同,但快速谷歌搜索说:不可能。)
快乐的编码。
虽然[标准] 浮点操作不会抛出异常(因为NaN
被编码为浮点值),整数< / em>数学运算可能会抛出异常(因为NaN
未编码)。如果操作是整数数学就足够了,那么它可以用来“抛出”异常:
int zero = 0; // to trick compiler
int k = 42 / zero; // KABOOM! (DivideByZeroException)
答案 1 :(得分:1)
浮点运算不会抛出异常。除以零显然不会产生有效答案,因此您应该在进行计算之前检查此方案。
答案 2 :(得分:-2)
如果可能,将此表达式简化为多个子表达式。
如果可能,请包含“try / catch(DivideByZeroException ex)”块。
最重要的是,如果可能的话,在“双”(或“浮动”)空间进行arimemetic(例如“24.0”而不是“24”)。