将数学公式转换为 Oracle 函数

Posted

技术标签:

【中文标题】将数学公式转换为 Oracle 函数【英文标题】:Math Formula Into Oracle Function 【发布时间】:2018-09-29 00:31:21 【问题描述】:

我有这个数学公式,我试图将其转换为 Oracle 函数。 这就是它的工作方式,taxableIncome 循环遍历表格,它选择表格的第一行,如果大于 CumulativeAmount,则减去 CumulativeAmount 来自 taxableIncome 并保留 余数,它将 CumulativeAmountPercentage 相乘得到一个值(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-100569,不是5590+33.45+55.9+97.825187.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,公式自动编号,数学公式规范

Markdown使用-6 截图公式转换

Markdown使用-6 截图公式转换

数学知识-三角函数公式大全(值得收藏)

图片转换为 latex 公式,识别图片中Latex公式,支持数学公式,化学公式,物理公式和生物公式,附Java代码和测试效果

图片转换为 latex 公式,识别图片中Latex公式,支持数学公式,化学公式,物理公式和生物公式,附Java代码和测试效果