使用方法
- 「发票类型」默认选增值税专用发票,对应 10 位发票代码;切换成增值税普通发票后,票面上的代码位数会变成 12 位,必填项也会相应减少。
- 「购买方名称」默认是「示例科技有限公司」;「购买方纳税人识别号」默认填
91350100M000100Y43,这是一串能在本地通过 18 位统一社会信用代码校验位算法的示例。 - 「货物或应税劳务、服务名称」示例填「技术服务费」,「数量」填
1,「金额(不含税)」填1000.00,「税率」选13%。 - 点「生成发票示例」。工具按 税额 = 金额 × 税率 算出 130.00 元,再按 价税合计 = 金额 + 税额 得到 1130.00 元,并把价税合计写成大写「壹仟壹佰叁拾元整」。
- 把「金额」改一改,比如填
884.96,税额会变成 115.04 元、价税合计 1000.00 元——同一组数字从另一个方向验证了上面两条公式。 - 点「复制文本」把票面按纯文本复制走,粘进记事本逐项核对字段是否齐全;点「载入默认示例」可随时回到上面这组默认值。
这个发票生成器能解决什么问题
一是价税分离的反复核算。开票前最常被问的一句话是「这 1130 元里有多少是不含税金额」,用 1130 ÷ 1.13 得到 1000.00、税额 130.00;反过来把不含税金额乘一遍税率,也能立刻校验对方给的数字对不对。
二是开票信息字段对照。专票要求购买方四项齐全(名称、纳税人识别号、地址电话、开户行及账号),普票在企业抬头下通常只要名称与纳税人识别号两项。切一下「发票类型」,票面上的字段栏会跟着变,用来确认手上资料是否够用。
三是税率档位试算。同一笔 1000.00 元的不含税金额,按 13%、9%、6%、3%、1%、0% 六个档位分别算出 1130.00、1090.00、1060.00、1030.00、1010.00、1000.00 六个价税合计,报价与合同比对时不用逐个手算。
四是大写金额核对。纸质票面上「价税合计(大写)」写错一个字就要作废重开,本页把 1130.00 直接写成「壹仟壹佰叁拾元整」,元位、角位、分位和「整」字的规则都按票面习惯处理。
本页不做这些事:不生成真实票据、不调用任何税务接口、不校验纳税人识别号在税务系统中的真伪、不处理差额征税与农产品核定扣除这类特殊计税,也不涉及个人所得税。票面是版式示意,不具有法律效力,不能用于报销、入账或抵扣。
生成原理:价税分离、位数结构与必填项
① 具体公式只有两条。税额 = 金额(不含税)× 税率,价税合计 = 金额 + 税额;反向则先用 金额 = 价税合计 ÷ (1 + 税率) 求金额,再用 税额 = 价税合计 − 金额 求税额。这个发票生成器把两条公式固化成唯一的计算路径,不做任何列名改写。增值税是典型的价外税:价格本身不含税,税额单独列示,购买方支付的是「价 + 税」,所以价税合计一定大于金额。相对地,消费税是价内税,税额已经含在价格里,价格与税额不并排列示,这也是两类税在票面上写法不同的根源。
② 为什么换算全部换成「分」做整数。IEEE 754 双精度下 0.1 + 0.2 等于 0.30000000000000004,直接拿「元」做浮点乘除,末位会在几厘之间飘。本页先把金额乘 100 变成整数分,13% 就等价于乘 13 再除 100:amtCents = Math.round(totalCents × 100 ÷ 113),税额 taxCents = totalCents − amtCents。整条链路只发生一次 Math.round 取整,误差不会逐次累积,也保证「金额 + 税额」恒等于价税合计,不会出现差一分钱对不上的情况。
③ 位数结构:代码与号码共同构成唯一键。发票号码是 8 位数字,单张代码下的号码空间就是 108 = 100000000 个;发票代码在增值税专用发票上是 10 位、在增值税普通发票上是 12 位,其中编码了开票地区与印制年份等信息(各票种的具体位数分配以当年税务总局公告为准)。把「代码 + 号码」合起来看,用 10 位代码时理论上能区分的票据是 1010 × 108 = 1018 种,这也是为什么票面上必须同时打印代码和号码。
④ 纳税人识别号为什么是 18 位。企业抬头用的是统一社会信用代码,共 18 位,遵循 GB 32100-2015;第 18 位是校验码,算法是 ISO 7064:1983 MOD 31-3。可用字符表共 31 个——数字 0~9 加大写字母,并剔除容易看错的 I、O、S、V、Z;前 17 位各自的权重依次是 1、3、9、27、19、26、16、17、20、29、25、13、8、24、10、30、28。把前 17 位按权重加权求和、对 31 取模并做 31 减余数,就得到第 18 位。工具对税号做格式硬校验(必须 18 位且字符都在表内),但校验位不匹配时只给黄色提示、不拦截——因为很多演示数据里的税号本来就是编的。
⑤ 大写金额的生成路径。把价税合计的分值拆成「元」和「角分」,元部分按四位一组从低位往高位切分成万、亿、万亿三级,每一组内映射到 零壹贰叁肆伍陆柒捌玖 加 拾佰仟,组与组之间补「万」「亿」。规则上有三处容易写错:连续零只写一个「零」(1005 是「壹仟零伍」而不是「壹仟零零伍」)、最低位的零不写(1130 是「壹仟壹佰叁拾」而不是「壹仟壹佰叁拾零」)、角分全为零时末尾加「整」(1130.00 是「壹仟壹佰叁拾元整」)。角位为零而分位不为零时,中间要补一个「零」,例如 100.05 写作「壹佰元零伍分」。
⑥ 专票与普票的必填项差别。专票的开票信息是四项:名称、纳税人识别号、地址与电话、开户行及账号,四项都指向购买方,缺一项就不能开;普票在企业抬头下一般只要名称与纳税人识别号两项。至于能不能抵扣进项税,专票(不属不得抵扣情形时)可以,普票一般不可以——这是两类票最本质的业务区别,和票面排版无关。
完整示例(数值仅作演示)
发票生成器在默认条件下的示例,与页面打开时的默认值完全一致:增值税专用发票、购买方「示例科技有限公司」、税号 91350100M000100Y43、项目「技术服务费」、数量 1、金额 1000.00、税率 13%。
- 不含税金额:1000.00 元(输入值);
- 税额:
1000.00 × 13% = 130.00元; - 价税合计:
1000.00 + 130.00 = 1130.00元; - 价税合计大写:壹仟壹佰叁拾元整;
- 发票代码 1100153130 为 10 位、发票号码 12345678 为 8 位,均为演示值。
再换一组更容易出错的值验证一遍:把「金额」改成 884.96、税率保持 13%,税额得 884.96 × 13% = 115.0448 → 115.04 元,价税合计 884.96 + 115.04 = 1000.00 元;反过来说,含税 1000.00 元的商品在 13% 下的不含税金额就是 884.96 元,两句话说的是同一件事。若税率换成 9%:1000.00 元的金额对应税额 90.00 元、价税合计 1090.00 元。
最后看一组大额:含税 1000000.00 元、13% 时,不含税金额为 884955.75 元、税额 115044.25 元、大写「壹佰万元整」。位数越长越能看出分位取整的影响——这也是本页坚持用整数分运算的原因。
税率档位、反算与必填项对照表
下表固定不含税金额 1000.00 元,列出六个档位各自的税额与价税合计,税额一律按分四舍五入:
| 税率 / 征收率 | 不含税金额 | 税额 | 价税合计 | 价税合计大写 | 常见适用 |
|---|---|---|---|---|---|
| 13% | 1000.00 | 130.00 | 1130.00 | 壹仟壹佰叁拾元整 | 销售货物、加工修理修配劳务、有形动产租赁 |
| 9% | 1000.00 | 90.00 | 1090.00 | 壹仟零玖拾元整 | 交通运输、建筑、不动产租赁与销售、农产品等 |
| 6% | 1000.00 | 60.00 | 1060.00 | 壹仟零陆拾元整 | 现代服务、生活服务、金融、增值电信 |
| 3% | 1000.00 | 30.00 | 1030.00 | 壹仟零叁拾元整 | 小规模纳税人征收率 |
| 1% | 1000.00 | 10.00 | 1010.00 | 壹仟零壹拾元整 | 小规模纳税人阶段性减征 |
| 0% | 1000.00 | 0.00 | 1000.00 | 壹仟元整 | 出口货物、跨境应税行为 |
第二张表是专票与普票的必填项对照,用来判断手上资料够不够开票:
| 票面信息项 | 增值税专用发票 | 增值税普通发票(企业抬头) | 增值税普通发票(个人抬头) |
|---|---|---|---|
| 购买方名称 | 必填(全称) | 必填(全称) | 可不填 |
| 纳税人识别号 | 必填(18 位) | 必填(18 位) | 不填 |
| 地址、电话 | 必填 | 可不填 | 不填 |
| 开户行及账号 | 必填 | 可不填 | 不填 |
| 能否凭票抵扣进项税 | 符合条件可抵扣 | 一般不可抵扣 | 不可抵扣 |
第三张表按 13% 把常见的含税金额反算成不含税金额与税额,前 12 行默认展示,剩余 3 行可以展开,也能整表导出:
| 价税合计(含税) | 不含税金额 | 税额(13%) | 价税合计大写 |
|---|---|---|---|
| 100.00 | 88.50 | 11.50 | 壹佰元整 |
| 200.00 | 176.99 | 23.01 | 贰佰元整 |
| 500.00 | 442.48 | 57.52 | 伍佰元整 |
| 1000.00 | 884.96 | 115.04 | 壹仟元整 |
| 1130.00 | 1000.00 | 130.00 | 壹仟壹佰叁拾元整 |
| 2000.00 | 1769.91 | 230.09 | 贰仟元整 |
| 5000.00 | 4424.78 | 575.22 | 伍仟元整 |
| 10000.00 | 8849.56 | 1150.44 | 壹万元整 |
| 11300.00 | 10000.00 | 1300.00 | 壹万壹仟叁佰元整 |
| 20000.00 | 17699.12 | 2300.88 | 贰万元整 |
| 50000.00 | 44247.79 | 5752.21 | 伍万元整 |
| 100000.00 | 88495.58 | 11504.42 | 壹拾万元整 |
| 113000.00 | 100000.00 | 13000.00 | 壹拾壹万叁仟元整 |
| 226000.00 | 200000.00 | 26000.00 | 贰拾贰万陆仟元整 |
| 1000000.00 | 884955.75 | 115044.25 | 壹佰万元整 |
输入范围、边界与精度说明
下面这些范围是这个发票生成器刻意设定的边界,知道它们能避免你把票面示例当成真实票据来用:
- 金额 0.01~99999999.99 元,最多两位小数。小于 0.01 元开不出一张票;填三位小数(如 1000.005)会被拒绝,因为票面金额只精确到分。上限取八位整数部分是为了和常见开票限额保持同一个量级。
- 数量 0.0001~999999.9999,单价由「金额 ÷ 数量」反推。数量 3 时单价是 333.33 元、数量 7 时是 142.86 元,都按分四舍五入,所以「单价 × 数量」未必能精确还原金额——这是四舍五入的必然结果,票面上以金额为准。
- 两种税额算法在分位会打架。算法 A 是「税额 = 价税合计 − 金额」,算法 B 是「税额 = 金额 × 税率」。实测在 13%、含税 1.00~2000.00 元区间里,有 22998 个金额(约 11.5%)两法结果相差 1 分,最早的样本是含税 1.00 元:算法 A 得金额 0.88、税额 0.12,算法 B 得税额 0.11。本页固定用算法 A,因为它能保证「金额 + 税额 = 价税合计」这一条票面恒等式。
- 税号 18 位是硬校验,校验位是软提示。少于或多于 18 位、或者出现
I、O、S、V、Z这些不在字符表里的字母,都会被拦下;但如果 17 位都对、只有第 18 位对不上,工具只在提示区标出「应为某字符」而不阻止生成,因为演示数据里的税号常常是编造的。 - 0%、免税、不征税是三件不同的事。0% 属于征税范围但税率为零,票面税额栏写 0.00,仍处在抵扣链条里;免税属于征税范围但依法免征,对应的进项不能抵扣;不征税则根本不在征税范围内,票面税额栏是空的。三者在票面上的呈现不同,不能只看「税额是 0」就当成一回事。
- 票面上的代码与号码是演示值。发票代码固定为专票 1100153130、普票 011002000311,号码每次生成在 8 位数字里随机给出。它们不对应任何真实票据,也不参与任何校验。
- 本页输出的是版式示意,不是票据。它没有二维码、没有密码区、没有发票监制章,也不具备任何税务意义上的效力。要拿真实票据,只能通过税务系统或开票方开具。
常见问题
生成的票面能拿去报销吗?
不能,也不要用。本页输出的只是一段按行列对齐的文本,既没有发票监制章、二维码和密码区,也没有真实代码与号码,不具有法律效力,不能用于报销、入账或抵扣。它的用途是核对字段是否齐全、验算金额与税额,而不是产出票据。
发票上的「金额」到底是含税还是不含税?
增值税票面里,「金额」列是不含税的,另有一列「税额」,「价税合计」才是含税的总额。三者满足 价税合计 = 金额 + 税额。把含税价直接填进税额公式(含税 × 税率)会多算 13%,这是最常见的错误;正确做法是先用 含税 ÷ (1 + 税率) 还原出金额。
13% 和 9% 该选哪个?
看的是销售的是什么,不是看购买方是谁。销售货物、加工修理修配劳务、有形动产租赁一般是 13%;交通运输、建筑、不动产租赁与销售、农产品等是 9%;现代服务、生活服务、金融、增值电信是 6%。小规模纳税人按征收率 3% 计算,阶段性减征期间可适用 1%。同一张票上不同税率的项目要分行填列,不能合并成一个金额。
专票和普票在必填项上差在哪里?
专票要求购买方四项齐全:名称、纳税人识别号、地址与电话、开户行及账号;普票在企业抬头下一般只要名称与纳税人识别号两项。业务上真正的区别是专票可以凭票抵扣进项税、普票一般不可以,必填项多出来的两项正是为了配合抵扣与对公结算。
纳税人识别号为什么是 18 位?校验位怎么来的?
企业抬头用的是统一社会信用代码,18 位,遵循 GB 32100-2015,最后一位校验码按 ISO 7064:1983 MOD 31-3 计算:前 17 位各乘一个固定权重后求和,对 31 取模,再用 31 减余数,映射回 31 个字符表(数字 0~9 与大写字母,剔除 I、O、S、V、Z)。示例里的 91350100M000100Y43 正好能通过这步校验。
0%、免税和不征税,票面上有什么不一样?
0% 是税率为零,属于征税范围,税额栏写 0.00,相关进项仍在抵扣链条内;免税也属于征税范围,但依法免征,对应的进项不得抵扣;不征税不在征税范围内,税额栏为空。三者都不能简单等同于「不用交税」,不能凭税额为零就互相套用。
为什么金额和税额相加会差一分钱?
因为两条算法路径不同。用「税额 = 金额 × 税率」时,先对金额取整再乘税率,再取整一次;用「税额 = 价税合计 − 金额」时只取整一次。两处取整叠加,就会出现 1 分的差异——实测 13%、含税 1.00~2000.00 元区间约有 11.5% 的金额会这样。本页统一用后者,保证票面上金额加税额恒等于价税合计。
填进去的开票信息会被上传吗?
不会。税额计算、大写转换、票面排版全部在当前页面完成,没有任何网络请求,也不写浏览器存储。想自己验证,打开开发者工具的 Network 面板,连点几次「生成发票示例」,可以看到没有新请求发出。不过也提醒一句:真实开票信息属于敏感数据,任何在线工具都不适合用来存放它。
相关工具
- 消费税计算器:消费税是价内税,价格里已经含税,和本页的价外税逻辑正好相反,对照着看更容易分清两类税。
- 统一社会信用代码校验:单独校验那 18 位税号,会逐位说明权重与校验码错在哪里。
- 身份证号校验:自然人代开发票时填的是身份证号,校验规则与税号不是同一套。
- 银行卡号校验:专票要填「开户行及账号」,账号本身也带校验规则,可以先在这里验一遍。
- ExpenseReport生成器:费用报销单的字段结构,正好和票面上的金额、税额对得上。
- 工时表生成器:按工时报工时单价再折算开票金额时,可以用它先算出总额。
- 实用工具:查看全部实用工具。