C#中判断浮点数是否为0,不可以将变量同0使用“==”或“!=”进行比较,那这样在进行是否为0的时候是不是就没有办法了呢?下面展示了两个判断思路:
近似比较
采取折中的方式,设法将直接相等比较转换为“>=”、“<=”的比较形式,达到近似的判断效果
const float PRECISION = 0.000001f;float x ;if (Math.Abs(x) <= PRECISION){ //浮点数x值为0}else{ //浮点数x值不为0}
或者不使用Math函数
const float PRECISION = 0.000001f;float x ;if (x <= PRECISION && x >= -PRECISION){ //浮点数x值为0}else{ //浮点数x值不为0}
精确判断
有的时候,近似比较已经不能满足要求,需要精确比较,那该怎么办呢?办法还是有的。
IEEE754标准中,单精度浮点数(4byte)表示法:1bit符号位(S),8bit指数位(E,用阶码表示),23bit小数部分(尾数M)。双精度浮点数(8byte)表示法:1bit符号位,11bit指数位(用阶码表示),52bit小数部分(尾数)。所以一个规格化的单精度浮点数x的真值为x=((-1)^S)*(1.M)*(2^(E-127));显然,x永远也不可能为绝对0。
针对上面的描述,当阶码E为全0且尾数M也全0时,可以认为表示的真值x为计算机中的绝对0值,再结合符号位S,有正0和负0之分;即32bit中除了最高1bit外,其余31bit全为0时,就是计算机中的绝对0值。
float f = pow((float)2,(float)-127) ;int *ptrToInt = (int*)(void*)&f ;if(!(*ptrToInt&(0x7fffffff))){ //计算机中的绝对0值}
这段代码需要开启unsafe标记
- 1楼『大雪无痕』
- 浮点数 确实 存在 比较时的 经度问题。,,但是 == != 其实 也是 可以用的。而且出错的 几率 也不大。
- Re: johnvwan
- @『大雪无痕』,如果对程序要求不高的话,用==或者!=判断也没什么问题。在对判断准确率和精度都有要求的环境,就需要采用这些方式作比较判断