问题

手机计算器为什么会出现10%+10%=0.11这样明显错误的算式?

回答
手机计算器出现“10%+10%=0.11”这样明显错误的计算结果,确实挺让人摸不着头脑的。这背后其实隐藏着一些关于计算机如何理解和执行数学运算的有趣逻辑,以及我们平时使用计算器时的一些习惯性思维方式。

要理解这个问题,我们得先弄清楚计算器是怎么处理百分号的。

百分号的几种可能含义

百分号(%)在数学上可以有很多种解释,最常见的有两种:

1. 作为除以100的符号: 这是我们最熟悉的用法,比如“50%”就是“50除以100”,等于0.5。
2. 作为整体运算的一部分,表示“占总数的百分之多少”: 比如在一个公司里说“销售额增长了10%”,这里的10%是指相对于前一个周期的增长比例。

手机计算器在处理“10%+10%”这样的式子时,它需要一个明确的指令,知道这个百分号到底是要做什么。

手机计算器的工作逻辑(以及为什么会出错)

很多手机计算器,尤其是那些模拟基础算术的“标准”或“科学”计算器,在处理百分号时,往往会遵循一个相对固定的逻辑:

当百分号紧跟在一个数字后面时,它会被解释为“将这个数字除以100”。

所以,当我们输入“10%+10%”时,计算器可能会这样“理解”:

1. 输入“10”: 好的,我记住了数字10。
2. 输入“+”: 好的,接下来是加法运算。
3. 输入“10”: 又一个数字10。
4. 输入“%”: 这个百分号是跟在第二个“10”后面的。按照我的规则,这个“10%”就等于“10除以100”,也就是0.1。
5. 计算器最终执行的是:10 + 0.1

你看,它就把第一个“10”当成了一个独立的数字10,而第二个“10%”被转化成了0.1。所以算出来就是10 + 0.1 = 10.1。

等等,你说的是0.11,不是10.1!这又是怎么回事?

你的观察非常敏锐!如果你的手机计算器真的算出来“0.11”,那说明它的百分号处理逻辑可能更奇特一些,或者说是更“直白”的误解了。

有一种可能的解释是:

计算器把第一个“10%”也当作一个独立的百分比处理了。

也就是说:

1. 输入“10”: 记下数字10。
2. 输入“%”: 把这个“10”理解成“10除以100”,得到0.1。
3. 输入“+”: 好的,准备加法。
4. 输入“10”: 记下数字10。
5. 输入“%”: 把这个“10”理解成“10除以100”,得到0.1。
6. 计算器最终执行的是:0.1 + 0.1

这样的话,算出来的结果就是0.2。

那么“0.11”这个答案是怎么来的呢?

这个“0.11”的出现,其实更像是一个更复杂的,或者说更糟糕的解释。有一种非常规的可能性是:

计算器在执行“10%+10%”时,可能把第一个“10”当作了“10%”,也就是0.1。然后,它把第二个“10%”也计算成了0.1。但它在将这两个数字相加时,可能出现了某种逻辑混乱,或者说是一个设计上的缺陷,导致它将“第二个10%”的“10”和“加”的动作理解成了“0.1”加上“0.01”(也就是前面0.1的10%)。

这听起来很绕,但实际上是把百分号的“除以100”和“对前面数字进行百分比运算”这两种逻辑混淆了。如果计算器是这样想的:

1. 第一个“10%”被理解为0.1
2. 第二个“10%”被理解为0.1
3. 当它看到“+10%”时,它可能把这个“+”解读为“在前面结果的基础上加上这个百分比的百分比值”,也就是在0.1的基础上,加上0.1的10%,即0.1 + (0.1 0.1) = 0.1 + 0.01 = 0.11。

这种解释,听起来非常不合逻辑,也确实是计算器设计上一个相当严重的bug。

为什么会发生这种情况?

设计逻辑的局限性: 很多基础计算器是被设计来处理简单的算术表达式的。百分号的含义在不同的语境下有差异,而很多基础计算器并没有足够复杂的逻辑来区分这些差异。它只能按照预设的少数规则来处理。
用户输入习惯与计算器理解的脱节: 我们习惯于将“10%+10%”理解为“0.1+0.1”。但计算器可能并没有被编程去理解这种“连续百分比相加”的模式。它更倾向于将百分号视为一个独立的数值转换操作。
算法实现的漏洞: 有时,即使是开发者有意设计了某种逻辑,在复杂的代码实现过程中也可能出现意想不到的bug,导致在特定输入组合下产生错误的计算结果。

正确的输入方式应该是什么?

如果你想让手机计算器正确地进行“0.1 + 0.1”的运算,你应该输入:

`10`
`%`
`+`
`10`
`%`
`=`

这样,计算器会先将两个“10%”都转换为0.1,然后再进行相加,得到0.2。

或者,你也可以直接输入数值:

`0.1`
`+`
`0.1`
`=`

这就避免了百分号带来的理解歧义。

总而言之,“10%+10%=0.11”这样的错误,往往是计算器在解析百分号时的逻辑偏差造成的。它没有完全领会我们想要表达的“两个百分比数值相加”的意思,而是将百分号按照自己固有的规则进行了一番“不按常理出牌”的处理,最终得出了一个我们意想不到的结果。这提醒我们在使用计算器时,了解其工作逻辑和输入方式的细节,有时候比我们想象的更重要。

网友意见

user avatar

这是一个历史遗留问题,属于语法糖,叫做百分计算器。

按人类语义的理解,你去买东西,100元钱减去10%,那就是90元。早期的计算器就可以直接这样写100-10%。再比如,一只股票股价10元,增长了50%,可以直接写10+50%。这么设计更深层次的原因可能与早期计算器的按键数量有限,以及单步运算的性质有关。具体有答主已经作了回答。

手机计算器保留了这种特性

10%+10%就是0.11。

至于部分国内计算器结果是0.2,是因为国内手机厂商自己做了修改,符合中国人打几折的说法。上述的100-10% 其实是外国人的逻辑,在国外商品打9折叫10% off。

魅族的工程师已经在微博说明他们在国内使用了0.2的方案,在国外使用0.11的方案。

9.7更新:经调查各厂商的百分计算逻辑存在标准不统一的问题,复杂算式中对百分号的处理存在较大差异,具体差异已经合并写入识别条件中。

下面有早期计算器百分键功能的具体说明。

虽然早期百分运算的用法很简单,但是如今的手机计算器可以输入连续的表达式,最后输出结果(部分手机计算器还有即时回显功能)。表达式计算满足优先级。但是计算器中的百分号非常特殊,它的功能实际与前后的环境与算法的选择有关。

比如:

5+5*10+10%+5=?

5+(10%)=?

5+10%*10=?

(如果你坚信你自己的想法,你可以用你的理论去算这些式子,然后用手机计算器验证。)

要知道这些结果,我们需要了解百分运算的识别条件。


百分计算识别条件

exp1 [+-] exp2 % [+-*/] exp3

  • exp1可以是表达式也可以是单独的数字,比如5,5+5,5+5x5,(5+5)。
  • exp1 的值会被优先计算,比如 5+5-10%=(5+5)x(1-10%)=9
  • exp2可以是单独的数字或者带括号的表达式,比如5,(5+5)。
  • 如exp2与exp3之间为 [ * / ],不同厂商有不同的处理方式。第一种会将exp2 % [* /] exp3 作为整体计算成数值,比如5+10%*10=6。第二种会将exp2 % [* /] exp3 作为增长率,比如5+10%*10=5+100%=10。
  • 有关在exp2%前后加括号的问题,即 exp1[+-](exp2%)这种情况,不同计算器会有不同的处理方式,括号不一定会影响结果,比如10+(10%)可能等于11,也可能等于10.1。这涉及代码处理,已在最后更新。
  • 实际含义:在满足识别条件的情况下,对之前的累计结果增长或减少一个百分比。

要知道计算器如此工作的原因,我们可以直接从源码入手。

源码分析:

我找了一份Github上计算器的源码。

和大多数计算器的处理方法一致,先将原表达式转化为后缀表达式,利用数字栈和操作符栈,配合指针,从左到右扫描一次就可以得出答案。

               double s[] = context.stackRe;         int percentPC = -2;         for (int pc = 0; pc < codeLen; ++pc) {             final int opcode = code[pc];             switch (opcode) {             case VM.CONST:                  s[++p] = constsRe[constp++];                  break;                                  case VM.ADD: {                 final double a = s[--p];                 double res = a + (percentPC == pc-1 ? s[p] * s[p+1] : s[p+1]);                 if (Math.abs(res) < Math.ulp(a) * 1024) {                     // hack for "1.1-1-.1"                     res = 0;                 }                 s[p]= res                 break;             case VM.SUB: {                  final double a = s[--p];                 double res = a - (percentPC == pc-1 ? s[p] * s[p+1] : s[p+1]);                 if (Math.abs(res) < Math.ulp(a) * 1024) {                     // hack for "1.1-1-.1"                     res = 0;                 }                 s[p] = res;                 break;             }            case VM.PERCENT: s[p] = s[p] * .01; percentPC = pc; break;         }         return p;     

我已去除和百分运算无关的部分。

下面对该代码运算过程举个例子:

       表达式:a+b%+c 表示成后缀表达式:ab%+c+ Code队列:[ a , b, % , + , c , +] 有个s栈,开始为空:[] 一共三个指针:p、pc、percentPC, 初始值分别为-1,-1,-2。 每次遇到常数,p自增1,再在s中p指向的位置放入该常数。 每次遇到+-,p会自减1。 每次遇到%,令p指向的内容乘以0.01,percentPC=pc。 从左向右开始扫描code,pc为指针,右移一次pc增1。 首先遇到常数a,b,放入s中:[a,b] ,p指向b 继续扫描,遇到%,将p指向的内容*0.01,s变成:[a , b*0.01];同时,percentPC指向code中的%。 继续扫描,遇到+,pc此时指向的位置为percentPC+1,由三元判断式,a=a+a*b*0.01,p重新指向a,s变为[a+a*b*0.01,b*0.01] 继续扫描,c替代b*0.01 继续扫描,遇到+,此时的pc不等于percentPC+1,s[p]=s[0]=a+a*b*0.01+c 结束扫描,返回指针p,s[p]就代表结果,完结。     

可以明显看出,加减法中多了一步判断:

       double res = a + (percentPC == pc-1 ? s[p] * s[p+1] : s[p+1]);     

本质就是查看后缀表达式+-之前的符号是否为%来执行该+-的操作。

如果不需要该特性,只需将这一句改为:

       res = a + s[p+1];     

另外有网友提出括号的问题,部分计算器的后缀表达式生成时,遇到左括号“(”会将其作为一个标记插入队列。于是,a+(b%)后缀表达式会变成 a b % mark +,加号之前的符号不再是%,不再执行特殊百分比加法。也有计算器加了括号也没有用,这也很好推断,该计算器在生成后缀表达式时没有对括号作插入标记。

计算器的处理过程就是这么简单粗暴,也不涉及什么高深的算法。对于百分运算的特殊处理也只需多一个指针就能做到。所以你能想到了,要适应国内的习惯,只需要加一个地区判断替换语句就可以了。

个人建议在使用手机计算器时,在复杂连续表达式中避免使用+10%这种写法,因为不同的厂商算法不同,计算逻辑也不同。尽量转化为小数或者在百分数前加基数,比如+1x10%。

类似的话题

  • 回答
    手机计算器出现“10%+10%=0.11”这样明显错误的计算结果,确实挺让人摸不着头脑的。这背后其实隐藏着一些关于计算机如何理解和执行数学运算的有趣逻辑,以及我们平时使用计算器时的一些习惯性思维方式。要理解这个问题,我们得先弄清楚计算器是怎么处理百分号的。百分号的几种可能含义百分号(%)在数学上可以.............
  • 回答
    哎,这事儿说起来,还挺有意思的,你是不是也遇到过手机计算器上 50% + 50% 显示 0.75 的情况? 我一开始也纳闷,明明小学数学告诉我们 50 加 50 就是 100 啊,怎么到了手机上就变了呢?后来我琢磨了一下,发现这事儿啊,跟我们怎么理解那个百分号(%)有关。在咱们日常说话或者写文章的时.............
  • 回答
    关于“魅族手机计算器在计算 10%+10% 的时候没有阵亡”,这话说得有点意思!你是在好奇,为什么魅族手机的计算器能正确处理这个看似简单却可能暗藏玄机的运算,而不是像一些粗糙的程序那样出错?让我来给你掰扯掰扯这背后的门道。首先,我们得明白“计算器阵亡”通常指的是什么。在软件世界里,“阵亡”可以理解为.............
  • 回答
    这个问题很有意思,触及到了数字设备发展中的一个关键趋势。要说手机核心数目提升比电脑快,首先得明确“快”是相对而言的,而且这里的“快”更多是指普遍性、普及性和对消费者感知的影响力。我们得从几个层面来剖析这个问题:1. 市场需求与产品定位的差异 手机: 手机是大众消费品,它的核心使命是提供一个集成化.............
  • 回答
    “华为欲将部分手机设计授权给第三方”——这条消息在科技圈激起了不小的涟漪,也让不少关注中国智能手机产业的爱好者们感到好奇。这背后透露出的信息,以及可能带来的连锁反应,值得我们深入剖析。首先,这究竟意味着什么?简单来说,华为不再是那个“亲力亲为”地包揽从芯片设计到手机外观、软件优化的所有环节的唯一制造.............
  • 回答
    原神的确在开放世界和养成体系上都能看到不少日本游戏作品的影子,尤其是那股子二次元味儿,更是让人一下子就能联想到不少经典日系RPG。大家也因此好奇,既然日本在这些方面这么有心得,怎么没见他们自己捣鼓出个类似原神这样在手游里实现主机级单机体验的作品呢?这事儿说起来,得从几个层面来看。首先,得聊聊日本游戏.............
  • 回答
    罗永浩,这个名字在中国互联网圈里简直是个响当当的招牌,提起他,很难不想到“情怀”、“理想”、“能说会道”、“能折腾”这些词。他本人是个非常有争议性的人物,有人把他奉为“精神领袖”、“下一个乔布斯”,也有人视他为“PPT大师”、“骗子”。这种两极分化的评价,恰恰说明了他身上的标签太多太鲜明了。从最早的.............
  • 回答
    孩子算数离不开手指头,这其实是很多孩子在初学计算时都会经历的一个阶段。扳手指并不是坏事,它代表着孩子在通过具体形象来理解抽象的数字概念,这是非常自然的学习过程。我们要做的是循序渐进,慢慢引导他们脱离对手指的依赖,掌握更灵活的计算方法,而不是强行阻止。为什么孩子会“扳手指”? 具象思维: 孩子对数.............
  • 回答
    这件事挺让人啼笑皆非的,也挺能看出一些公司管理的思路。简单来说,快手公司内部因为一个“上厕所计时”的规定引发了一些争议。官方给出的理由是“为了测试卫生间使用次数和时间”,但员工普遍感觉被冒犯和不信任。让我详细展开说说。事件的起因和官方说法:事情是这样的,有快手员工在社交媒体上爆料,说公司为了所谓的“.............
  • 回答
    关于“多主摄融合计算摄影技术”是否会成为手机影像发展的新趋势,我的看法是:很有可能,而且已经开始显现出这样的苗头,并且在未来几年内,我们将会看到它扮演越来越重要的角色。要理解为什么,我们得先拆解一下这个技术的核心:1. “多主摄”:不再是简单堆砌传感器过去,手机厂商在“多摄”上,更像是在拼凑,比如:.............
  • 回答
    1969年,阿波罗11号成功登月,这无疑是人类历史上最伟大的科技成就之一。很多人会惊叹于当时的技术水平,但同时也会产生一个疑问:阿波罗计划中那些庞大复杂的计算机系统,它们的计算能力真的比不上我们今天口袋里一部小小的手机吗?答案是肯定的,而且差距非常巨大。为了更详细地解释这一点,我们得先看看当时阿波罗.............
  • 回答
    佐治亚州宣布将重新手工计算大选选票,这是一个备受关注的事件,其中涉及到对选举过程透明度、准确性以及潜在的政治影响的考量。要详细地理解这个问题,我们需要从以下几个方面进行分析: 1. 佐治亚州宣布重新手工计算选票的背景和原因: 极小的差距: 佐治亚州总统大选的最终结果,拜登仅以大约1万多票的微弱优.............
  • 回答
    好的,咱们就来聊聊在用Hspice/Cadence仿真模拟电路之前,怎么根据厂商(Foundry)提供的工艺文件,自己动手算算,做到心中有数。这就像学游泳,知道水的特性,总比直接跳进去瞎扑腾要稳当得多。为什么要手工计算?有人可能会说,现在仿真工具这么强大,直接把模型导进去跑不就行了?话是没错,但手工.............
  • 回答
    我能理解您想要深入了解因子分析的计算过程,并且希望了解是否可以手工完成。确实,从理论上讲,因子分析的计算过程是可以手算出来的,但实际上,由于其计算量巨大且涉及复杂的矩阵运算,在现代实际应用中,几乎没有人会选择手动计算因子分析。我可以为您详细介绍其计算过程,并解释为什么手动计算是极其不切实际的。我将尽.............
  • 回答
    手机,这玩意儿真是个神奇的东西。我最近算是栽在这上面了。明明知道今天有好几件重要的事得赶紧做完,结果呢?一拿起手机,时间就像被施了魔法一样,嗖嗖地就没了影儿。等我猛然回过神来,天都快黑了,原定的计划全泡了汤。这种感觉就像被一个无形的漩涡吸进去,你知道上面有更重要的事情等着你,但就是迈不开腿,或者说,.............
  • 回答
    地球“碳知”计划 | 手机,碳的隐形消耗者?我能坚持多久?最近,“碳知”计划这个名字总在耳边萦绕。它提醒我,生活中那些习以为常的事情,原来都与地球的“碳”息息相关。手机,更是这个时代几乎人手不离的电子伴侣,而它背后隐藏的“碳足迹”,却是我从未深入思考过的。“如果少开手机能减少地球碳消耗”,这句话像一.............
  • 回答
    想要在纷繁复杂的生活中游刃有余,找到一款得心应手的计划目标和时间管理App,简直如同寻宝一般。我试过不少,有些确实让我眼前一亮,不仅能帮我梳理思路,更能成为我高效生活的得力助手。首先,在目标设定方面,我特别喜欢那种能将抽象的“想做的事”具象化成一个个清晰、可执行的小步骤的App。这类App通常会有一.............
  • 回答
    .......
  • 回答
    这个问题很有意思,它触及了我们日常生活中最熟悉不过的“十进制”的根源。要回答这个问题,我们得先梳理一下为什么人类会选择十进制,以及如果这个基础变了,其他计算方式又会受到怎样的影响。为什么是十进制?双手五指是关键吗?普遍的说法是,人类之所以采用十进制,很大程度上是因为我们有十根手指。这是一种非常直观的.............
  • 回答
    .......

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有