搞无线组网的时候,偶尔会碰上一些“莫名其妙”的问题。比如你写了个脚本,统计每台设备的带宽使用率,结果加起来总是差那么一点点,0.1 + 0.2 不等于 0.3?这不是代码写错了,而是浮点数在“作怪”。
为什么0.1 + 0.2不等于0.3?
这个问题听起来离谱,但其实在计算机里再正常不过。因为计算机用二进制存储数字,而像0.1这样的小数,在二进制中是无限循环的——就像1/3在十进制里是0.333...一样。系统只能截取一段近似值,这就带来了精度损失。
来看个例子:
let a = 0.1;
let b = 0.2;
console.log(a + b); // 输出可能是 0.30000000000000004
这和无线组网有啥关系?
你可能觉得:“我又不搞科学计算,管它准不准。”可实际中,这种误差会影响网络资源的调度。比如你用脚本自动分配QoS权重,每个设备分0.1的优先级,三个设备理论上该是0.3,结果算出来是0.30000000000000004,后面做判断时 if (weight === 0.3) 就永远不成立,策略直接失效。
再比如,统计某AP下所有用户的流量占比,每个用户占1.5%,加60个人理论上是90%,可程序跑出来是89.999999%,你在界面上显示“总占比:89.99%”,运维一看就懵了:“漏了谁?”
怎么绕开这个坑?
最简单的办法:别直接比浮点数是否相等。要判断两个浮点数是否“差不多”,可以用一个极小的数作为容差范围。
function isEqual(a, b) {
return Math.abs(a - b) < 1e-10;
}
console.log(isEqual(0.1 + 0.2, 0.3)); // true
另一个方法是,在做累加时尽量用整数运算。比如把“0.1 Mbps”换成“100 Kbps”来算,最后再除回去。虽然麻烦点,但稳定可靠。
如果你用的是Python,可以考虑 decimal 模块;JavaScript 虽然没有原生高精度支持,但也有 big.js、decimal.js 这类库可用,关键场景不妨引入。
别让小数拖了自动化后腿
现在很多人用脚本管理路由器、AP集群,一旦涉及数值计算,浮点误差就可能悄悄埋雷。别等到策略没生效、数据对不上才回头查,从一开始就得防着这点。
下次你发现“明明没错却不对”,不妨打个断点看看,是不是那个熟悉的0.30000000000000004又出现了。