本篇博客为译文,原文为Microsoft开发者博客The Old New Thing中的一篇博文,原文地址:https://blogs.msdn.microsoft.com/oldnewthing/20080110-00/?p=23853/

Windows计算器百分比符号的工作方式与那些便宜的口袋计算器(通常称为四则计算器,虽然它们现在有大约六种功能)相同。首先要了解的是,这些口袋计算器的百分号键不是为数学家和工程师设计的。它是专为你的日常生活做一些简单的计算。因此,这个按键的一些行为对于你这样的工程师来说,可能是奇怪甚至错误的。但对于一个普通人来说,它干得很好。至少在理论上是这样的。

让我们从普通人的角度去看它。假如你想算一下一件72美元的毛衣在算上5%的税(注1)之后一共要多少钱。拿出你的口袋计算器(注2)(如果你没有口袋计算器就打开windows自带的)并输入

72 + 5% =

结果是75.6,或者说是75.60美元,这是正确答案,因为72的5%是3.6,加上72就得到75.6.

同样的,假如这件毛衣正在以20%的折扣销售,那么销售价格是多少呢?

72 - 20% =

结果是57.6,或者说是57.60美元。这没错,因为72的20%是14.4,用72减去14.4就是57.6.

你也可以使用百分号进行链式计算。比如在加上5%的税之后,你需要为那件有20%折扣的毛衣付多少钱呢?

72 - 20% + 5% =

结果是60.48.一个数学家或工程师可以通过以下等效计算得出相同的结果

72 × 0.80 × 1.05 =

好了,现在我们看到计算器的产品设计者认为百分号键是如何使用的了,再让我们来看看计算器的工程师是如何去实现这些要求的。当用户输入A + B% = 时,展开后结果应该是A × (1 + B/100) 或者A + (A × B/100)。类似地,当用户输入A − B % =时,结果应为A × (1 − B/100) 或者 A − (A × B/100)

“啊哈!”计算器工程师说,“我们可以通过这样定义百分号键来实现这个结果”:

当用户输入第一个值,运算符,第二个值,然后是百分号键时,前两个值相乘,乘积再除以100,用得到的结果取代处于算式中的第二个值。

让我们先来看一下这个算法。

输入 注释
72 第一个值是72
+ 加法操作
5 第二个值是5
% 72 × 5 ÷ 100 = 3.6
3.6变成了新的第二个值
= 72 + 3.6 = 75.6,最终结果

如果你跟着这个流程看的话,你将会发现当你按下百分号键后,数字3.6就会出现在显示屏上。百分号计算并替换了计算流程中原始的值。

该算法同样适用于链式计算。

输入 注释
72 第一个值是72
- 减法操作
20 第二个值是20
% 72 × 20 ÷ 100 = 14.4
14.4变成了新的第二个值
+ 72 − 14.4 = 57.6,中间结果
57.6是新的第一个值
加法操作
5 第二个值是5
% 57.6 × 5 ÷ 100 = 2.88
2.88成为了新的第二个值
= 57.6 + 2.88 = 60.48,最终结果

这甚至也可以用于乘法和除法,但是很少有数字乘以或除以自身的百分之多少。

500 x 5% =

结果是12500,因为你将500乘以500的5%(25),那么500 x 25的结果就是12500. 你并不是在计算500的5%.(在写下这篇分析文章之前,知识库的作者似乎并没有咨询计算机工程师。百分号键的行为按设计来的,但问题是它不是为工程师而设计的。)

那如果要计算500的5%该怎么办呢?只需做个虚拟的操作,就能在你按下百分号键后看到结果

500 x 5%

当你按下百分号键时,答案就会出现:25.(译者注:这里是指在按下等于号的最终结果出来之前的那个中间值)。你也可以使用减号、乘号或者除号,没关系,因为按下百分号键后你要得到的答案就会出现,然后你就可以点击清空以开始一个新的计算。

脚注:

注1:在美国,报价通常不包括适用税。

注2:在我有限的实验中,似乎没有两个口袋计算器制造商以完全相同的方式处理百分号键。卡西欧似乎以最接近工程师的方式处理它。 德州仪器更接近于普通人的算法。当你遇到像是1÷2%的情况下,计算器就不靠谱了。答案应该是50,因为1/2等于50%?或者应该是0.005,因为0.005就是0.5%?应该立即出现这个答案还是等待你按下等号?我(译者注:这里指原作者)也不知道结果应该是什么。