将数学公式转换为 Oracle 函数
Posted
技术标签:
【中文标题】将数学公式转换为 Oracle 函数【英文标题】:Math Formula Into Oracle Function 【发布时间】:2018-09-29 00:31:21 【问题描述】:我有这个数学公式,我试图将其转换为 Oracle 函数。 这就是它的工作方式,taxableIncome 循环遍历表格,它选择表格的第一行,如果大于 CumulativeAmount,则减去 CumulativeAmount 来自 taxableIncome 并保留 余数,它将 CumulativeAmount 和 Percentage 相乘得到一个值(x ),取余数并转到表中的下一行,并从余数中减去 CumulativeAmount。当余数小于 CumulativeAmount 时,它将应用 17.5余数。稍后我将对 (x) 值求和以获得总值。数值计算不正确。
CREATE OR REPLACE function CalculateIncomeTax(periodId NVARCHAR2,
employeeId NVARCHAR2,paygroupcode PAYROLL_MASTER.PAY_PAY_GROUP_CODE%type,
taxableIncome NUMBER)
return NUMBER
AS
IncomeTax NUMBER (10,2);
BEGIN
SELECT
coalesce(SUM(
CASE WHEN (taxableIncome > T.TAX_CUMMULATIVE_AMOUNT) THEN (taxableIncome -
T.TAX_CUMMULATIVE_AMOUNT)* (T.TAX_PERCENTAGE/ 100)
ELSE 0.00 END
) ,0)
INTO IncomeTax
FROM TAX_LAW T JOIN PAY_GROUP P ON P.PAY_FORMULA_ID =T.TAX_FORMULA_ID
WHERE P.PAY_CODE = paygroupcode;
return IncomeTax;
end;
/
例如:
taxableIncome= 1000,the function must loop on the first line on the
table CummulativeAmount=261,so 1000-261=739, and 0*739=0,0 is
value(x),
next loop 739>70,739 is the remainder,so 739-70=669, and (5/100)*70
=3.5,3.5 is value(x),
next loop 669>100,669-100=569, (10/100)*100=10,10 is value(x),
now 569 < 2810, so (17.5/100)*569=99.575,99.575 is value(x).
so we sum all x =0+3.5+10+99.575= 113.075
如果 taxableIncome = 300,300 大于表中的 261 所以我们将使用 0 的百分比,但我们会得到 0.now (300-261) 小于 70 所以不能使用 5 的百分比所以所得税是 0。但是 17.5 将应用于 (300-261) 得到 6.825,总所得税是 6.825。这是计算背后的逻辑。我想在计算时使用 while 语句。
【问题讨论】:
“数值计算不正确” - 解释一下。你期望什么值,基于什么输入,你得到什么返回值,为什么这是错误的?请编辑您的问题并提供示例输入作为文本,而不是作为图像,以及计算应该是什么的完整演练。谢谢。 您使用的是哪个版本的 Oracle? @BobJarvis,你甚至没有仔细阅读这个问题,我解释了数学公式必须如何工作。如果我知道为什么我的函数是错误的,我不会来这里问。你无济于事。 @APC,我使用的是 Oracle 版本 12c 这个问题还有一些不清楚的地方。如果taxableIncome = 300
,比如说?如果taxableIncome = 10000
怎么办?您的函数中提到的PAY_GROUP
表的目的是什么?另外,请注意您的工作示例计算有两个错误:669-100
是569
,不是559
,0+33.45+55.9+97.825
是187.175
,不是232.725
。
【参考方案1】:
CREATE OR REPLACE function CalculateIncomeTax2(taxableIncome NUMBER)
return NUMBER
AS
IncomeTax NUMBER (10,2) := 0;
TaxableRemainder NUMBER := taxableIncome;
BEGIN
for r in (select tax_id, tax_percentage, tax_cummulative_amount
from incometax
order by tax_id)
loop
if TaxableRemainder > r.tax_cummulative_amount then
TaxableRemainder := TaxableRemainder - r.tax_cummulative_amount;
incometax := incometax + (r.tax_cummulative_amount * r.tax_percentage / 100);
else
incometax := incometax + (TaxableRemainder * r.tax_percentage / 100);
exit;
end if;
end loop;
return IncomeTax;
end;
/
【讨论】:
以上是关于将数学公式转换为 Oracle 函数的主要内容,如果未能解决你的问题,请参考以下文章
word编辑的公式转换为mathtype,公式自动编号,数学公式规范
图片转换为 latex 公式,识别图片中Latex公式,支持数学公式,化学公式,物理公式和生物公式,附Java代码和测试效果
图片转换为 latex 公式,识别图片中Latex公式,支持数学公式,化学公式,物理公式和生物公式,附Java代码和测试效果