教学网站建设,洪梅东莞网站建设,建设母婴网站的目的,驻马店做网站推广#x1f4e2;欢迎点赞 #xff1a;#x1f44d; 收藏 ⭐留言 #x1f4dd; 如有错误敬请指正#xff0c;赐人玫瑰#xff0c;手留余香#xff01;#x1f4e2;本文作者#xff1a;由webmote 原创#x1f4e2;作者格言#xff1a;新的征程#xff0c;我们面对的不是… 欢迎点赞 收藏 ⭐留言 如有错误敬请指正赐人玫瑰手留余香本文作者由webmote 原创作者格言新的征程我们面对的不是技术而是人心人心不可测海水不可量唯有技术才是深沉黑夜中的一座闪烁的灯塔 1.简单的比较预期的结果
一天我在飞快的写代码当然这个飞快我打上了引号 因为手速奇快吗并没有。
我遇到一个非常普通的场景对于码农多年的我老说应该是小菜一碟了。
然而这次不一样我被比较浮点数绊倒了。
简单描述下场景 大概的业务逻辑是这样的 在一个判断告警的逻辑里需要判断某个值在小于0.9时就进行告警动作。
代码如下
bool IsAlarm(float a)
{return a0.9;
}//不相干的业务逻辑,简化下。。。
if(IsAlarm(a)){Console.WriteLine(嘀嘀嘀报警了!);
}写完了代码就转给测试了然后反馈说不该报警的时候报警了。
这是什么鬼啊
Review了N遍代码也找不到原因是啥。
2.写单元测试
由于业务场景复杂又不方便调试因此实在打不开思路的我开始折腾起单元测试。
[Fact]
public void TestAlarmSuccess()
{var a 0.9F;var ret IsAlarm(a);Assert.False(ret);
}元凶终于浮出了水面竟然时浮点比较出了问题。经过反复确认和排查的的确确是
0.9F 0.9顺便说一嘴这里用的是C# 0.9F 是单精度浮点数而 0.9 默认应该是 双精度浮点数。
看到这里聪明的你是不是恍然大悟了
如果你还是不明白 那么跟着我再来探究探究其中的奥秘。
3. 原因说明
由于无知我甚至跑到了github上提了一个issue哦哦大神给了我这样的解释。 这是预期的结果 更多的信息可以参考: IEEE Standard for Floating-Point Arithmetic 看下面的例子 float data 0.9F;
var firstComparisonValue 0.9;
var secondComparisonValue 0.9F;
Console.WriteLine(data firstComparisonValue);
// return trueConsole.WriteLine(data secondComparisonValue);
// return falseConsole.WriteLine(data secondComparisonValue);
// return trueConsole.WriteLine($Data Value: {data.ToString(F99)});
Console.WriteLine($First Comparison Value: {firstComparisonValue.ToString(F99)});
Console.WriteLine($Second Comparison Value: {secondComparisonValue.ToString(F99)}); 输出结果: True False True Data Value: 0,899999976158142089843750000000000000000000000000000000000000000000000000000000000000000000000000000 First Comparison Value: 0,900000000000000022204460492503130808472633361816406250000000000000000000000000000000000000000000000 Second Comparison Value: 0,899999976158142089843750000000000000000000000000000000000000000000000000000000000000000000000000000 正如你看到的那样double 类型的值是大于float类型的值的. 总结
比较数字的时候 先强制转换成统一类型的数字然后比较才会得到你预期的结果。
否则你就需要了解更多的IEEE规范知识要不然一不小心就掉到了坑里。
都看到这了还在乎点个赞吗
都点赞了还在乎一个收藏吗
都收藏了还在乎一个评论吗