PHP 计算个人所得税(两种方式)
前言
使用此种计算方式前,需要知道当年已纳税总额度以及本月应纳税额度。这两个参数需要自行根据各自系统数据计算出来,此方法只实现个税计算算法。此外,需要打开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 计算个人所得税(两种方式)相关推荐
- padding卷积的两种方式“SAME”和“VALID”
conv2d是常用的实现卷积的,Tensorflow调用Conv的api时,常用代码如下: 查看:https://tensorflow.google.cn/api_docs/python/tf/nn/ ...
- c语言返回二叉树的大小,C语言中计算二叉树的宽度的两种方式
C语言中计算二叉树的宽度的两种方式 二叉树作为一种很特殊的数据结构,功能上有很大的作用!今天就来看看怎么计算一个二叉树的最大的宽度吧. 采用递归方式 下面是代码内容: int GetMaxWidth( ...
- PageRank、图计算、图存储的两种方式
目录 PageRank 什么是PageRank? 算法原理 入链 ====投票 入链数量 入链质量 网络上各个页面的连接图 计算过程 初始值 迭代递归计算(收敛) 图存储的两种方式 代码实现 Page ...
- 关于个人独资企业、自然人代开核定征收两种方式如何选择?
个人独资企业和自然人代开这两种方式的核定征收,两者虽然都是核定征收,但是还有不少区别的,如何选择呢? 近期有不少朋友,企业负责人都在咨询相关的信息,公司和公司.公司和公司以外的个人业务等,没有进项成本 ...
- jvm两种方式获取对象所占用的内存
在开发过程中,我们有时需要来获取某个对象的大小,以方便我们参考,来决定开发的技术方案.jvm中提供了两种方式来获取一个对象的大小. 通过Instrumentation来计算对象的大小 编写计算代码: ...
- SparkStreaming从Kafka读取数据两种方式
参考文章:http://www.jianshu.com/p/60344796f8a5 在结合 Spark Streaming 及 Kafka 的实时应用中,我们通常使用以下两个 API 来获取最初的 ...
- 如何用两种方式同时实现ListBox的滚动功能
今天,要用WPF实现一个可以通过Windows触屏左右滑动的ListBox控件,并且,同时也可以通过点击两个按钮,进行左右滑动. 实现这个控件,有几个难点: 两种方式,都需要有一个共同的值或方式来记录 ...
- [原][osg][gdal]两种方式修改tiff高程
因为对于globalmap不熟悉,不怎么怎么修改高程,好像也没有这功能. 干脆自己手动修改了高程图tiff了 由于自身一直使用osg的 自己使用了osgDB直接读取tiff,修改后保存的. 同事小周一 ...
- html中获取modelandview中的json数据_从Bitmap中获取YUV数据的两种方式
从Bitmap中我们能获取到的是RGB颜色分量,当需要获取YUV数据的时候,则需要先提取R,G,B分量的值,然后将RGB转化为YUV(根据具体的YUV的排列格式做相应的Y,U,V分量的排列) 所以这篇 ...
- 基础知识:编程语言介绍、Python介绍、Python解释器安装、运行Python解释器的两种方式、变量、数据类型基本使用
阅读目录 今日学习内容: 1.编程语言的介绍 2.Python介绍 3.安装Python解释器(多版本共存) 4.运行Python解释器程序两种方式.(交互式与命令行式)(♥♥♥♥♥) 5.变量(♥♥ ...
最新文章
- java设计模式----装饰器模式
- 片元着色器(Fragment Shader)被称为像素着色器(Pixel Shader),但
- 书评 | 你为什么成不了资深产品经理?
- T4文本模板转换过程
- 机器学习Sklearn实战——其他线性回归模型、逻辑回归
- JAVA NIO之文件通道
- 华为路由器 android,华为智能路由器亮相 Android系统很强大
- 【深度学习】近几年,关于基于Imagenet数据集图像分类的模型总结
- oracle客户端工具_Oracle 发布基于 VS Code 的开发者工具,轻松连接 Oracle 数据库
- 通过经度纬度得到距离
- 计算机网络之数据链路层:4、流量控制和可靠传输机制(停止等待协议、后退N帧协议、选择重传协议)
- 北京 | 蚂蚁集团共享智能团队招聘研究实习生
- 关于VBScript的运行环境
- 微信小程序tabBar图标大小64 * 64
- Javaeve博客教你怎么发带图片的博客,非其他网络连接图片
- Go使用gos7实现西门子PLC通讯
- win10 开 5g 热点
- 计算机为什么设ip,怎么设置电脑ip
- 哈夫曼树的构造及C++代码实现
- CCD视觉应用上有哪些优势