前言

使用此种计算方式前,需要知道当年已纳税总额度以及本月应纳税额度。这两个参数需要自行根据各自系统数据计算出来,此方法只实现个税计算算法。此外,需要打开PHP的bc扩展。

参数

方法传入两个参数即可,当月应纳税额度以及本年已纳税总额度(不含当月)。

  • $lauwen_monthly_tax_amount:当月应纳税额度。
  • $lauwen_taxed_amount:当年已纳税总额度(不含当月)。

实现

首先是确认两个层级,一个是本年已纳税总额度所在税率层级(不含当月),另一个是本月之后本年已纳税总额度所在税率层级(含当月);最后在计算个税时使用了两种计算方式,一种是分别计算在每个税率层级的税额;另一种是使用速算扣除数进行计算,按需使用就好。

分级计算核心代码

    // 分级法计算$tax = '0';while ($new_key >= $old_key) {$level_amount = bcsub($lauwen_month_after_amount, $lauwen_tax_amounts[$new_key], 6);if ($new_key == $old_key) {$level_amount = bcsub($lauwen_month_after_amount, $lauwen_taxed_amount, 6);}$tax = bcadd($tax, bcmul($level_amount, $lauwen_tax_rates[$new_key]), 2);$lauwen_month_after_amount = $lauwen_tax_amounts[$new_key];$new_key --;}

速算扣除计算核心代码

    // 速算扣除法计算$quickly_old_tax = bcsub(bcmul($lauwen_taxed_amount, $lauwen_tax_rates[$old_key], 6), $lauwen_tax_quickly[$old_key], 6);$quickly_new_tax = bcsub(bcmul($lauwen_month_after_amount, $lauwen_tax_rates[$new_key], 6), $lauwen_tax_quickly[$new_key], 6);$tax0 = bcsub($quickly_new_tax, $quickly_old_tax, 2);

全部代码

function personTax($lauwen_monthly_tax_amount, $lauwen_taxed_amount) {$lauwen_tax_amounts = ['0', '36000', '144000', '300000', '420000', '660000', '960000'];$lauwen_tax_rates = ['0.03', '0.1', '0.2', '0.25', '0.3', '0.35', '0.45'];$lauwen_tax_quickly = ['0', '2520', '16920', '31920', '52920', '85920', '181920'];$lauwen_taxed_amount = (string)$lauwen_taxed_amount;$lauwen_monthly_tax_amount = (string)$lauwen_monthly_tax_amount;$lauwen_month_after_amount = bcadd($lauwen_taxed_amount, $lauwen_monthly_tax_amount, 6);// 确定当月前当年已纳税总额度所属级别,以及当月之后当年已纳税总额度所属级别$old_key = 0;           // 当月前级别$new_key = 0;           // 当月后级别$end_key = count($lauwen_tax_amounts) - 1;foreach ($lauwen_tax_amounts as $key => $val) {if ($key == $end_key) {             // 最后一级if (bccomp($lauwen_taxed_amount, $val, 2) == 1) {$old_key = $key;}if (bccomp($lauwen_month_after_amount, $val, 2) == 1) {$new_key = $key;}} else {            //if (bccomp($lauwen_taxed_amount, $val, 2) == 1 && bccomp($lauwen_taxed_amount, $lauwen_tax_amounts[$key+1], 2) == -1) {$old_key = $key;}if (bccomp($lauwen_month_after_amount, $val, 2) == 1 && bccomp($lauwen_month_after_amount, $lauwen_tax_amounts[$key+1], 2) == -1) {$new_key = $key;break;}}}// 速算扣除法计算$quickly_old_tax = bcsub(bcmul($lauwen_taxed_amount, $lauwen_tax_rates[$old_key], 6), $lauwen_tax_quickly[$old_key], 6);$quickly_new_tax = bcsub(bcmul($lauwen_month_after_amount, $lauwen_tax_rates[$new_key], 6), $lauwen_tax_quickly[$new_key], 6);$tax0 = bcsub($quickly_new_tax, $quickly_old_tax, 2);// 差额法计算$tax = '0';while ($new_key >= $old_key) {$level_amount = bcsub($lauwen_month_after_amount, $lauwen_tax_amounts[$new_key], 6);if ($new_key == $old_key) {$level_amount = bcsub($lauwen_month_after_amount, $lauwen_taxed_amount, 6);}$tax = bcadd($tax, bcmul($level_amount, $lauwen_tax_rates[$new_key]), 2);$lauwen_month_after_amount = $lauwen_tax_amounts[$new_key];$new_key --;}return json_encode(["normal"     =>  $tax,"quickly"    =>  $tax0,]);
}

PHP 计算个人所得税(两种方式)相关推荐

  1. padding卷积的两种方式“SAME”和“VALID”

    conv2d是常用的实现卷积的,Tensorflow调用Conv的api时,常用代码如下: 查看:https://tensorflow.google.cn/api_docs/python/tf/nn/ ...

  2. c语言返回二叉树的大小,C语言中计算二叉树的宽度的两种方式

    C语言中计算二叉树的宽度的两种方式 二叉树作为一种很特殊的数据结构,功能上有很大的作用!今天就来看看怎么计算一个二叉树的最大的宽度吧. 采用递归方式 下面是代码内容: int GetMaxWidth( ...

  3. PageRank、图计算、图存储的两种方式

    目录 PageRank 什么是PageRank? 算法原理 入链 ====投票 入链数量 入链质量 网络上各个页面的连接图 计算过程 初始值 迭代递归计算(收敛) 图存储的两种方式 代码实现 Page ...

  4. 关于个人独资企业、自然人代开核定征收两种方式如何选择?

    个人独资企业和自然人代开这两种方式的核定征收,两者虽然都是核定征收,但是还有不少区别的,如何选择呢? 近期有不少朋友,企业负责人都在咨询相关的信息,公司和公司.公司和公司以外的个人业务等,没有进项成本 ...

  5. jvm两种方式获取对象所占用的内存

    在开发过程中,我们有时需要来获取某个对象的大小,以方便我们参考,来决定开发的技术方案.jvm中提供了两种方式来获取一个对象的大小. 通过Instrumentation来计算对象的大小 编写计算代码: ...

  6. SparkStreaming从Kafka读取数据两种方式

    参考文章:http://www.jianshu.com/p/60344796f8a5 在结合 Spark Streaming 及 Kafka 的实时应用中,我们通常使用以下两个 API 来获取最初的 ...

  7. 如何用两种方式同时实现ListBox的滚动功能

    今天,要用WPF实现一个可以通过Windows触屏左右滑动的ListBox控件,并且,同时也可以通过点击两个按钮,进行左右滑动. 实现这个控件,有几个难点: 两种方式,都需要有一个共同的值或方式来记录 ...

  8. [原][osg][gdal]两种方式修改tiff高程

    因为对于globalmap不熟悉,不怎么怎么修改高程,好像也没有这功能. 干脆自己手动修改了高程图tiff了 由于自身一直使用osg的 自己使用了osgDB直接读取tiff,修改后保存的. 同事小周一 ...

  9. html中获取modelandview中的json数据_从Bitmap中获取YUV数据的两种方式

    从Bitmap中我们能获取到的是RGB颜色分量,当需要获取YUV数据的时候,则需要先提取R,G,B分量的值,然后将RGB转化为YUV(根据具体的YUV的排列格式做相应的Y,U,V分量的排列) 所以这篇 ...

  10. 基础知识:编程语言介绍、Python介绍、Python解释器安装、运行Python解释器的两种方式、变量、数据类型基本使用

    阅读目录 今日学习内容: 1.编程语言的介绍 2.Python介绍 3.安装Python解释器(多版本共存) 4.运行Python解释器程序两种方式.(交互式与命令行式)(♥♥♥♥♥) 5.变量(♥♥ ...

最新文章

  1. java设计模式----装饰器模式
  2. 片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但
  3. 书评 | 你为什么成不了资深产品经理?
  4. T4文本模板转换过程
  5. 机器学习Sklearn实战——其他线性回归模型、逻辑回归
  6. JAVA NIO之文件通道
  7. 华为路由器 android,华为智能路由器亮相 Android系统很强大
  8. 【深度学习】近几年,关于基于Imagenet数据集图像分类的模型总结
  9. oracle客户端工具_Oracle 发布基于 VS Code 的开发者工具,轻松连接 Oracle 数据库
  10. 通过经度纬度得到距离
  11. 计算机网络之数据链路层:4、流量控制和可靠传输机制(停止等待协议、后退N帧协议、选择重传协议)
  12. 北京 | 蚂蚁集团共享智能团队招聘研究实习生
  13. 关于VBScript的运行环境
  14. 微信小程序tabBar图标大小64 * 64
  15. Javaeve博客教你怎么发带图片的博客,非其他网络连接图片
  16. Go使用gos7实现西门子PLC通讯
  17. win10 开 5g 热点
  18. 计算机为什么设ip,怎么设置电脑ip
  19. 哈夫曼树的构造及C++代码实现
  20. CCD视觉应用上有哪些优势

热门文章

  1. python设函数解方程_如何在Python函数最小化中获得速度,求椭球方程解
  2. makefile终极目标
  3. should be described in NUMA config 和 CPU feature cmt not found
  4. Deepin 手动安装显卡驱动
  5. 计算机的静态存储区在哪里,静态随机访问存储器
  6. PDF提取器:ByteScout PDF Extractor SDK
  7. Python爬虫练习:爬取蜂鸟网图片数据
  8. html三段式布局,移动端 三段式布局 (flex方式)
  9. 百度网盘 api抓包
  10. 令人比较失落的IT圈子-关于华为裁员