C#中由NaN引起的错误

博客分类: code

C#中由NaN引起的错误

C#中由NaN引发的错误及其修改。

简述

以下是出错的代码

public double Temp { get=>_temp;
            set {
                if(value == double.NaN){
                    throw new ValOutOfRangeException();
                }
                _temp = value;               
            }
        }

原意是在属性Temp上添加setter,如果要将Temp设为NaN则抛出异常。

结果任然可以将Temp设为NaN

原因

造成这一错误的原因是double.NaN不能用==判等

运行如下代码

Console.WriteLine($"{double.NaN==double.NaN}");

其结果是False

解决

double.IsNaN判断

public double Temp { get=>_temp;
            set {
                if(double.IsNaN(value)){
                    throw new ValOutOfRangeException();
                }
                _temp = value;               
            }
        }

延伸

除了NaN以外,其他的浮点数也最好不用==判断。

Math.Net有相关的解决方案。

查看 Precision.cs