你有没有想过,有一天机器人验证会变成程序员的“专属考题”?

最近一张图在程序员圈子里流传甚广:一个网站弹出了机器人验证,题目是 0.1 + 0.2 = ?。如果有人老老实实填了 0.3,结果反而被判定“不是人类”;而当一个“懂行”的人在输入框里敲下 0.30000000000000004 时,系统却温柔地提示:“您已通过验证,请继续”。
下面的代码截图更是精准地戳中了程序员的集体笑点:

运行结果赫然显示:
0.30000000000000004
0.1 + 0.2 为什么不等于 0.3?每个程序员的“入门第一课”
如果你是刚接触编程的新手,第一次在控制台看到 print(0.1+0.2) 输出 0.30000000000000004 时,大概率会陷入深深的自我怀疑:“我小学就学过的数学,怎么到了电脑里就出错了?”
其实,这不是电脑“笨”,问题出在二进制和十进制之间的“翻译误差”。
- 我们日常使用的是十进制,0.1、0.2 都是非常规整的小数。
- 但计算机底层是二进制的。许多在我们看来简单的十进制小数,转换成二进制后会变成无限循环小数。例如:
- 0.1 的二进制表示约等于
0.0001100110011...(无限循环)。
- 0.2 的二进制表示约等于
0.001100110011...(同样是无限循环)。
而 Python(以及几乎所有的现代编程语言)在存储这类数字时,普遍采用的是 64 位双精度浮点数标准(IEEE 754)。这种格式最多只能存储 53 位有效的二进制数字。这就意味着,我们输入的 0.1 和 0.2 在计算机内部存储时,就已经不是精确值,而是被截断后的近似值。
两个本身就带有微小误差的近似值相加,最终结果自然也会累积这点误差,于是我们就得到了那个经典答案:0.30000000000000004。
这并不是 Python 独有的“Bug”,而是 C、Java、JavaScript 等语言共有的“特性”。它就像程序员世界里的一个经典“都市传说”,每个开发者都或早或晚地会被它“坑”一次,并由此真正开始思考计算机基础里关于数据表示的底层逻辑。

这张广为流传的截图之所以有趣,是因为它跳脱了验证码机械式提问的常规。它仿佛在说:“今天,我们不找人类,我们找‘自己人’。”当一个机器人验证开始用程序员圈内的“梗”来设卡时,事情确实变得有趣了。
你在学习或工作中遇到过哪些有趣的、只有“圈内人”才懂的验证方式或技术梗?欢迎到 云栈社区 分享你的见闻和思考。
|