终于有人注意到这个问题了!
每个人的手机当中,都藏着一个难以察觉的“漏洞”。
它也许微不足道,但运气不好,也可能会酿成财产损失。
嗯,就是前两天上了热搜的——
事情是这样的……
机哥先问问大家一个简单的计算题。
10% + 10% =?
毫无疑问,答案是 20%。
如果用小数表示,也就是 0.2。
可据网友们反映,这道简单的计算题,却让大部分品牌的手机阵亡。。
巧了,机哥啥都缺,唯独不缺手机。
所以分别拿出主流品牌的手机,试了试。
结果如下:
华为
10% + 10% = 0.11
小米
10% + 10% = 0.11
OPPO
10% + 10% = 0.11
vivo
10% + 10% = 0.11
一加
10% + 10% = 0.11
国产热门品牌全线阵亡……我们来看看国外的厂商。
苹果
10% + 10% = 0.11
三星
10% + 10% = 0.11
看来无论是国产,还是国外品牌,无一例外地栽了。。
真的无一幸免吗?
当机哥绝望地把目光投到国产小厂,希望出现了。
魅族!
感动,这就叫极致打磨啊朋友们。
除此之外,网友说另一家小厂商——锤子,也能通过这次考验。
机哥拿出坚果 R1 试了一下。
锤子的计算机常规界面……并没有 % 这个符号。
咱只能切换到科学计算器上。
果然,它也算出了我们想要的答案。
10% + 10% = 0.2
但是,普通计算器和科学计算器逻辑肯定会有不同,对比稍有点不公平。
OK,所以机哥今天,决定把“年度最佳计算器”的称号……
颁给魅族!
不过,凡事咱们不能只看表象。
手机厂商们齐刷刷“阵亡”,背后的原因到底是什么?
其实拿小米做运算的时候,端倪就已显现。
你们仔细看看机哥输入的动作:
当机哥输入第一个 10%,算式栏会直接把它转化成 0.1。
可第二个 10%,却被转化成 0.01。
这么一相加,结果当然是 0.11。
可问题是,计算器为什么会把第二个 10% 识别为 0.01 呢。
其实稍微想想咱就能明白,计算器认为“+10%”在人类的语境中,代表的是“加前一个数的 10%”。
所以尽管输入的是10% + 10%,计算器实际执行的是10% +(10% x 10%)。
今天一早,小米产品总监@MIUI小凡,和荣耀总裁赵明,不约而同地在微博上解释了这件事。
他们都有提到一个情境,可能会让你更加理解这样做的意义。
欧美那边的餐厅,时常会有给小费的习惯。
假设机哥消费 200 块钱,给 10% 小费,请问最后我该给多少钱?
如果按严谨的算术规则来写,应该是:
这对于从小精通算术的中国人来说,没毛病。
但对于那些算术稍弱的欧美人来说,就不是这样了。
他们习惯于口语表达,200 块,加 10%。
然后双手跟着大脑,在键盘里按下 200 + 10% 这样的算式。
为了“迁就”他们,手机系统无论是安卓还是 iOS,都会把不严谨的算式自动转化一番。
最后他们还是能得到正确答案 220。
OK,现在你们理解手机,为什么会出 10% + 10% = 0.11 这种问题了吧。
只不过是套用了这个优化规则而已。
而转换到科学计算器之后,部分品牌又恢复了理智。
比如小米:
话说,虽然这一话题最近才在国内引爆。
但国外有网友早在 2016 年,就对这件事产生过迷惑。
这位网友的质疑正好和我们相反
他觉得100+10%=100.1是错的
而且,手机的计算器不是第一次出错了。
2011 年,MIUI 论坛上出现过这样一则帖子:
《【惊爆低级错误】Android 计算器出错!!!》
这位网友在 HTC Desire 手机的计算器中输入:
14.52 - 14.49 =
答案本该是 0.03。
但他的计算器算出来是 0.0299999……
图片来自MIUI论坛
这个错误就不是 feature,而是一个实打实的程序缺陷。
接下来拿出小本本,机哥来给大家讲解一下,为什么会出这种错误。
——轻度烧脑时间开始——
我们知道,手机计算器虽然是用十进制显示,但背后的运算靠的依然是二进制。
也就是说,当我们输入 10 + 10,计算器幕后实际执行的是 1010 + 1010。
(十进制的 10 转换为二进制就是 1010)
所以回到楼主提出的算式:14.52 - 14.49。
问题就出在 14.52 和 14.49 这两个数,虽然在十进制中看起来清爽无比。
但转换为二进制的时候,它们会变成无限循环的数。
(为什么无限循环机哥就不说了,那是数学上的问题,我们知道结果就好)
你看,机哥用的这个二进制转换器,就提示“超出计算精度”。
没办法,超出就超出吧,咱们用这个只保留 16 位的小数,进行下一步运算。
两者相减,等于 0.0000011110101110。
再把它转换回十进制,结果是:
这个转换器精度只有16位,把我输入的数略掉了一位
看吧,0.029998779296875,错误答案就是这样出来的。
而早期安卓手机计算器的浮点精度,虽然比机哥的 16 位高,但也是有限的。
所以他们的答案是 0.0299999……
——轻度烧脑时间结束——
总而言之,这个问题不是 MIUI 的错,也不是 HTC 的锅,都是来源于 Android。
当时的安卓手机几乎全部中枪。
你们不用拿出手机试,这个 bug 早就被修复了。
除了安卓,iOS 也闹过所谓的计算器 bug。
2017 年,苹果推出 iOS 11。
有网友反映自带的计算器,在计算 1+2+3 这样的幼儿园算术题,居然会给出 24 的结果。
出 bug 的原因非常简单,就是因为用户第一次点击“+”,它会有个淡入淡出的动画。
一旦输入太快,动画还没结束时,用户第二次点击的“+”无法被识别。
所以算式会从“1+2+3”变成“1+23”,答案自然变成 24。
后来苹果在 iOS 11.2 版本中,粗暴地去掉加号的淡入淡出动画,修复此 bug。
图片来自Benjamin Mayo
再后来的 iOS 11.3,苹果加回动画,提高响应速度,彻底解决这个问题。
图片来自Benjamin Mayo
看了这么多计算器 bug,是不是对咱们手中的“智能”手机产生怀疑了呢。
要我说嘛,还是学好数理化,背熟九九乘法表,凡事靠自己才是硬道理。