欢迎访问申博官网!

申博138动态

一个小小计算器,把国内外所有大厂搞疯了

频道:申博138动态 日期: 浏览:68

终于有人注意到这个问题了!

每个人的手机当中,都藏着一个难以察觉的“漏洞”

它也许微不足道,但运气不好,也可能会酿成财产损失。

嗯,就是前两天上了热搜的——

事情是这样的……

机哥先问问大家一个简单的计算题。

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,是不是对咱们手中的“智能”手机产生怀疑了呢。

要我说嘛,还是学好数理化,背熟九九乘法表,凡事靠自己才是硬道理。

关键词: