跳到主要内容
CalcMax

折扣计算器

范围:0.01 – 1,000,000,000

范围:0 – 100

范围:0 – 100

结果

72.00

实付

第一段折后价
80.00
省下
28.00
合计折扣率
28.00%

只打一段折扣的计算器到处都有,值得做的是两段连续叠加的那一个,因为连续折扣正是算术开始不直观的地方:先打八折、再打九折,合起来等于打了七二折,也就是减了 28%,不是 30%。第二段折扣是作用在第一段剩下的那个价上的,所以那个 10% 是八十的 10% 而不是一百的 10%,它从原价里实际砍掉的是 8 个点而不是 10 个。你听到的折扣率与你实际拿到的折扣率之间的这段距离,就是这一页存在的理由,面板上单独给它一行。

原价 100、先打八折之后第二段各是多少

第二段折扣合计折扣率实付
02080
102872
203664
304456

每一行都把原价锁在 100、第一段锁在 20%,变的只有第二段。中列是把两段合成一个率,竖着读它正是这张表的用意:第二段 10% 把合计折扣带到 28 而不是 30,第二段 20% 把它带到 36 而不是 40,第二段 30% 把它带到 44 而不是 50。第二段越大,差的这一截越宽,而它永远等于「第二段的率 × 第一段已经减掉的那一部分」——第一段剩下的 80 里那 10% 就是 8,也就是第一行缺掉的那两个点。这张表不挂币种、不含税,第一行是没有叠加时的单段情形,末列始终是同一行那个率作用在同一个原价上的结果。

公式

第一段折后价 = 原价 × (1 − 折扣一 ÷ 100) | 实付 = 第一段折后价 × (1 − 折扣二 ÷ 100)

listPrice
还没有打任何折扣的原价。面板上每一项都由它推出来,所以原价填 0 会被拒绝:那会得到一块全是零的面板而不是一个答案
discountPercent
第一段折扣,作用在完整原价上。两段里实际砍得更多的那一段是它,因为第二段能作用的价已经变小了
additionalDiscountPercent
第二段折扣,作用在第一段剩下的价上。它砍掉的实际比例比它自己的数字要小,而这一页讲的正是这件事
priceAfterFirstDiscount
第一段折扣过完之后的价格。它是第二段折扣的作用对象,也就是为什么第二个 10% 只值 8%
finalPrice
你实际要付的钱。它是面板上的主结果,也是第二段折扣走完所到达的那个数
savings
原价减去实付,是从面板上印出来的两个数相减得到的,不是把两段折扣率加起来
effectiveDiscountPercent
把两段折扣率合成一个。它永远小于两个率之和,20% 再 10% 的情形下是 28% 而不是 30%

当同一笔价格上叠着两段减免、你想知道它们合起来是多少时用它:标价之外收银台再减一次、优惠券叠在季末折扣上面、会员价叠在促销价上面。只有一段折扣时请用单段的那一页,因为本页多印的那一行在那种情形下没有东西可显示。

算例

  1. 默认算例:100 元先打八折,再打九折

    1. 第一段折后价:100 × (1 − 20 ÷ 100) = 80.00
    2. 第二段折后价:80 × (1 − 10 ÷ 100) = 72.00
    3. 省下:100.00 − 72.00 = 28.00
    4. 合计折扣率:28.00 ÷ 100 × 100 = 28.00%

    20% 再 10% 是读整页的那一组数:答案是 28 而不是两个率相加的 30,差的那两个点就是第二段落在 80 而不是落在 100 上。验算请做加减法而不是乘法:100.00 减 28.00 正好是 72.00,这就是最后两行要保住的那条等式。

  2. 第二段为 0:250 元打九折

    1. 第一段折后价:250 × (1 − 10 ÷ 100) = 225.00
    2. 第二段折后价:225 × (1 − 0 ÷ 100) = 225.00
    3. 省下:250.00 − 225.00 = 25.00
    4. 合计折扣率:25.00 ÷ 250 × 100 = 10.00%

    第二段填 0 是正当输入而不是空着:填 0 时两个价格行会重合。这既是对「第二段真的是一次乘法、不是变相加价」的验证,也说明本页是单段那一页的超集——第二段填 0 时两页逐字一致。

  3. 带分的原价:49.99 元先打八五折,再打九五折

    1. 第一段折后价:49.99 × 0.85 = 42.4915,舍到两位 = 42.49
    2. 第二段折后价:42.49 × 0.95 = 40.3655,舍到两位 = 40.37
    3. 省下:49.99 − 40.37 = 9.62
    4. 合计折扣率:9.62 ÷ 49.99 × 100 = 19.2448… = 19.24%

    这一条是「每一段落地到分」看得见的地方,也是中间那一行最有用处的地方:第一段的真值是 42.4915,而第二段是在 42.49 上算的,不是在一次乘完所携带的那个值上算的。合计折扣落在 19.24 而不是 15 与 5 相加的 20,差的这一部分里第二段占小头。

  4. 两段相等、两种约定分道扬镳的那一组数

    1. 第一段折后价:10 × (1 − 33.33 ÷ 100) = 6.667,舍到两位 = 6.67
    2. 第二段折后价:6.67 × (1 − 33.33 ÷ 100) = 4.446889,舍到两位 = 4.45
    3. 省下:10.00 − 4.45 = 5.55
    4. 合计折扣率:5.55 ÷ 10 × 100 = 55.50%

    十元、两段都是三分之一,这是把两种算法分开的那一组数。两段一次乘完是 10 × 0.6667 × 0.6667 = 4.444889,舍到两位是 4.44;每段各舍一次是 4.45。本页取每段各舍一次,差一分,而这一分是拿着小票的人看得见的,所以本页把用的是哪一种明说出来,而不是等人来对不上才发现。

  5. 字段允许的最小原价,连打两次对折

    1. 第一段折后价:0.01 × 0.5 = 0.005,舍到两位 = 0.01
    2. 第二段折后价:0.01 × 0.5 = 0.005,舍到两位 = 0.01
    3. 省下:0.01 − 0.01 = 0.00
    4. 合计折扣率:0.00 ÷ 0.01 × 100 = 0.00%

    半分钱不是一个价格,把它进位回去是价格必须做的事。于是两段各走一次之后价格原地不动,面板报出「省下 0.00」,合计折扣率是 0。看起来像坏了,其实是分的下限:本页印不出比最小单位更低的价,所以在最小的那个价上,它能表达的最深折扣就是没有折扣。

局限

有两个约定值得在看数之前先知道。第一个是每一段折扣走完就落地到分,跟收银台一样,而不是把两个率乘在一起最后只舍一次。多数价格下两种算法一致,少数价格下差一分,而本页取的是每段各舍一次,因为只有它的数在屏幕上自己解释得通——原价减省下精确等于实付,用印出来的数一减就对上。这一分在中国法下不是问题:《明码标价和禁止价格欺诈规定》第二十一条第(三)项明确写着,成交结算后实际折价、减价幅度与标示幅度不完全一致、但符合舍零取整等交易习惯的,不属于价格欺诈(原文在下方参考来源里)。如果你拿本页去对小票、差了一分,多半就是这个原因,而以哪一段先减为准的是小票。第二个约定是价格不能低于它的最小单位,所以在一个足够小的价上叠足够深的折扣,会深到什么都不减:一分钱连打两次对折还是一分钱,面板报「省下 0.00」,这不是折扣算错了,是分的下限。本页也不判这个折扣真不真、划不划算。原价是你填进来的数,本页没有第二个来源可以核对它,所以它能告诉你「从这个原价减下去是多少」,不能告诉你「这个原价有没有真的被标过」。这件事在中国法下的口径是《明码标价和禁止价格欺诈规定》第十七条:经营者没有合理理由,不得在折价、减价前临时显著提高标示价格并作为折价、减价的计算基准;经营者不得采用无依据或者无从比较的价格作为计算基准或被比较价格。这条管的是商家能怎么标价,不是算术,本页也不拿它去核对任何一格输入。这里的数都是税前(不含税)的数,不挂任何币种,因为哪种货币下算术都一模一样;也不建模任何税费——如果之后要加销售税,它是加在折扣之后剩下的那个价上而不是加在原价上,那是另一页的事。最后,两个折扣率被当作互不相关来算。有些促销不是这样:券面写明不与其它优惠同享的,其实只有一段折扣,把它填进第二格会算出一个比规则允许更大的减免,因为本页没有办法知道券面上写了什么。

常见问题

先打八折再打九折,是不是等于打七折?
不是,差的这一截正是本页存在的理由。第二段九折作用在第一段剩下的八十上,所以它砍掉的是 8.00 而不是 10.00,两段合起来是 28%。两个率离得越远,合计折扣率与它们的和差得越多:两个五折合起来是 75% 而不是 100%,两个九折合起来是 19% 而不是 20%。面板把合计折扣率单独印一行,就是为了让你把听到的那个数与拿到的那个数并排看。
两段折扣的先后顺序会影响结果吗?
就结果而言不影响。同样两个率换个顺序算会落在同一个价上,因为两个步骤就是同样两次乘法换了个次序,而乘法是可交换的——每一段舍入取的又是同一个中间值,所以舍入也不会把它打乱。会变的是中间那一行:它印的是第一段之后的价格,所以如果你想让面板上的行按你实际经历的顺序走,把收银台那一段填在第二个格子里。
为什么省下的金额是相减得到的,而不是两段折扣算出来再相加?
因为面板必须用它印出来的数自圆其说。两段折扣各自算出来再相加,会把第一段已经从原价里减掉的那部分重复算一次,结果与实付那一行对不上。用原价减实付得到的数,读者做一次减法就能验证,而最后两行就是围着这条等式搭的:原价减省下精确等于实付,用屏幕上的数一减就成立。
为什么每一段都要舍一次,而不是最后统一舍一次?
因为连着打两段折扣本来就是这么发生的,而且只有它的数在屏幕上对得起来。收银台是先减第一段、得到一个价、再在这个价上减第二段。两种约定在多数价格上一致,少数价格上差一分:十元打两次 33.33%,每段各舍一次是 4.45,两段一次乘完是 4.44。本页取每段各舍一次,并且专门有一条算例把它演出来,也就是说这个约定是明摆着的,不需要靠对不上来发现它。
为什么一分钱连打两次对折,一分钱都没省下来?
因为半分钱不是一个价格,而价格只能进位到它的最小单位。一分钱打对折是半分钱,进位回去还是一分钱,第二段再做一遍同样的事。本页印不出比最小单位更低的价,所以在最小的那个价上,它能表达的最深折扣就是没有折扣。这是算术的下限而不是算错了,上面那条 4.45 而不是 4.44 的算例也是同一个下限在起作用。
券面写明不与其它优惠同享的券,能填在第二格吗?
只有在这两段减免确实都能用的时候才可以,而这是券面条款的问题、不是算术问题。写明不与其它优惠同享的券实际上只有一段折扣,把它填进第二格会算出一个比规则允许更大的减免,因为本页没有地方记录券面写了什么,也没有办法拿输入去核对它。本页算的是两段先后发生的减免的算术,两个率都按字面取用;这两段是不是真的都轮得到你,是跟商家确认的事。

参考资料

相关计算器