1

现在是一月底,“纳税时间”的神奇感觉正在世界各地开始。一个常见的问题是根据一组税级和税率计算所欠税款。这也类似于根据数量和数量折扣价计算总订单成本。

我已经看到了一些基于此问题类型的旧问题/答案,但没有人将其视为一般功能,所以我想我会在这里发布一个。这个想法是创建一个通用解决方案,使用LET它可以在LAMBDA可用时包装。

美国联邦所得税税率 2021

因此,让我们以 2021 年美国联邦所得税表为例:

税率 单从 单到 户主 从 户主 已婚共同备案 来自 已婚共同申报 至 已婚分开申报 已婚分开报到
10% - 9,950 - 14,200 - 19,900 - 9,950
12% 9,951 40,525 14,201 54,200 19,901 81,050 9,951 40,525
22% 40,526 86,375 54,201 86,350 81,051 172,750 40,526 86,375
24% 86,376 164,925 86,351 164,900 172,751 329,850 86,376 164,925
32% 164,926 209,425 164,901 209,400 329,851 418,850 164,926 209,425
35% 209,426 523,600 209,401 523,600 418,851 628,300 209,426 314,150
37% 523,600 523,600 628,300 314,151

所以问题是 -给定应税收入的总税额是多少? 例如,100k。(正确答案是 18021)

批量折扣定价

让我们再举一个同一系列的例子——批量折扣定价。下表显示了每批订单数量的订单数量和单价。

数量从 数量到 单价
0 100 16.00
101 250 14.40
251 500 12.96
501 1000 11.66
1001 2000 10.49
2001年 5000 9.44
5001 10000 8.50

一个问题可能是:订购 1200 个单位的成本是多少? (正确答案是 14928)

计算如何工作

税表和数量折扣都通过在每个税率或折扣单价的括号内累积来计算。

示例 - tax calc 应税收入为 50,000 的单身人士应缴纳的税款为:

9950 * 10% +

(40525-9950) * 12% +

(50000-40525) * 22% = 6748.50

示例 - 批量折扣 220 个单位的订单将支付前 100 个单位的 16 元和接下来的 120 个单位的 14.40 元:

100 * 16.00 +

(220-100) * 14.40 = 3328

客观的

有一个可用于通用批量折扣或税表计算的公式。

我将发布我自己的解决方案,但我不会将其标记为答案 - 我确信那里有更好的解决方案,也许有人LAMBDA可以展示如何将其构建为通用解决方案。

相关问题

IF 语句为 3 个以上的条件返回不同的值

计算成本所需的复杂公式,包括多个折扣

数组公式基础而不是嵌套 if-else

使用 Excel 是否可以在不显式生成表格数据但仅使用公式的情况下绘制图表?

4

2 回答 2

0

我将使用简单的vlookup:

=VLOOKUP(E2,A2:C8,3,1)*E2

在此处输入图像描述

我得到 11329.26 使用:

(((VLOOKUP(E2,$A$2:$C$8,3,1)-VLOOKUP(E2+1000,$A$2:$C$8,3,1))/1000*E2)+VLOOKUP(E2+1000,$A$2:$C$8,3,1)*E2)
于 2022-01-30T20:42:40.673 回答
0

我不得不改变这一点,因为我在查看 Solar Mike 的回复后意识到我错误地计算了支架尺寸。

所以这是我的方法。对于 Office 365,我将使用 LET,如下所示:

=LET( a, $K2,
        from, tTax2021[Single From],
        to, tTax2021[Single To],
        m, tTax2021[Tax rate],

        t, IF( ISBLANK( to ), a, to ),
        i, SEQUENCE( ROWS(t),,0 ),
        f, IF( i = 0, 0, INDEX( t, i ) ),
        bracketIdx, MATCH( a, from, 1 ),
        bracketSize, t-f,
        mb, m*bracketSize,
        rmb, LET( array, mb,
                   rSeq, SEQUENCE( ROWS( array ) ),
                   ones, --(rSeq >= TRANSPOSE( rSeq )),
                   MMULT( ones, array ) ),
       cumBase, INDEX( rmb, MAX(1,bracketIdx-1) ) * SIGN( bracketIdx-1 ),
       prorataBracket, ( a - INDEX( f, bracketIdx ) ) / INDEX( bracketSize, bracketIdx ) * INDEX( mb, bracketIdx ),
       cumBase + prorataBracket )

在哪里:

a是我在单元格 K2 中输入的金额。在税收示例中,它将是 100000。

f是定义括号的 from 列。

t是定义括号的 to 列。

m是每个类别的边际利率。

税表案例

这是使用名为 tTax2021 的 Excel 表部署的视图。

在此处输入图像描述

批量折扣案例

这是应用于上述批量折扣问题的相同公式:

在此处输入图像描述

简化表

一些税收和折扣表只有From列,没有To列。实际上,To 列在任何情况下都是多余的,所以这里有一个只接受 From 列的版本:

=LET( a, $K2,
        from, tTax2021[Single From],
        m, tTax2021[Tax rate],

        i, SEQUENCE( ROWS(from),,0 ),
        to, IFERROR( INDEX( from, i+2 ), a ),
        bracketSize, to-from,
        bracketIdx, MATCH( a, from, 1 ),
        mb, m*bracketSize,
        rmb, LET( array, mb,
                   rSeq, SEQUENCE( ROWS( array ) ),
                   ones, --(rSeq >= TRANSPOSE( rSeq )),
                   MMULT( ones, array ) ),
       cumBase, INDEX( rmb, MAX(1,bracketIdx-1) ) * SIGN( bracketIdx-1 ),
       prorataBracket, ( a - INDEX( from, bracketIdx ) ) / INDEX( bracketSize, bracketIdx ) * INDEX( mb, bracketIdx ),
       cumBase + prorataBracket )

LAMBDA 函数

好的 - 所以我终于可以访问 LAMBDA 了,它允许这是一个更通用的功能。所以这里是一个基于上面简化表的 LAMBDA 版本:

// Applies degressive pricing, volume discounting, or progressive taxation to 
//  a given Amount based on marginal units (or rates) for each Bracket.
//  amount : the sales order or income amount [value, array or range]
//  fromBrackets : the minumum amount for each bracket [array or range]
//  marginalUnits : the unit price or the tax rate within each bracket [array or range sized the same as fromBrackets]
BRACKETSUM =
LAMBDA( amount, fromBrackets, marginalUnits,

     LET(
            i, SEQUENCE( ROWS(fromBrackets),,0 ),
            to, IFERROR( INDEX( fromBrackets, i+2 ), a ),
            bracketSize, to-fromBrackets,
            bracketIdx, MATCH( amount, fromBrackets, 1 ),
            mb, marginalUnits*bracketSize,
            rmb, SCAN(0,mb,LAMBDA(a,b,a+b)),
           cumBase, INDEX( rmb, MAX(1,bracketIdx-1) ) * SIGN( bracketIdx-1 ),
           prorataBracket, ( amount - INDEX( fromBrackets, bracketIdx ) ) / INDEX( bracketSize, bracketIdx ) * INDEX( mb, bracketIdx ),
           cumBase + prorataBracket )
)
于 2022-01-30T20:33:03.357 回答