【问题标题】:Mathematical formula not giving same answer in C# as in excel, or calculator数学公式在 C# 中给出的答案与在 excel 或计算器中的答案不同
【发布时间】:2009-02-02 14:55:53
【问题描述】:

我一直在尝试使用一个公式来计算我们团队正在创建的程序中的独家增值税。该公式在计算器或 Excel 中使用时可以正常工作,但在我们程序的函数中使用时会给出不同的输出!

函数如下:

function fn_calcVat() 
{
    var vRate = Ext.getCmp('crd_vat_rate').getValue();
    var vTranAmt = Ext.getCmp('crd_tran_amt').getValue();

    if (vRate != '' && vTranAmt != '') 
    {
        alert(Ext.getCmp('vatable').getValue().toString());
        var vAmt = 0;
        if (Ext.getCmp('vatable').getValue().toString() == 'Y')
        {
            vAmt = (vRate / ((vTranAmt / 100) + 1));
            Ext.getCmp('crd_vat_amt').setValue(vAmt.toFixed(2));
            Ext.getCmp('crd_tran_tot').setValue(vTranAmt.toString());
            vAmt = 0;
        }
        else 
        {
            vAmt = ((vRate / 100) * vTranAmt);
            Ext.getCmp('crd_vat_amt').setValue(vAmt.toFixed(2));
            Ext.getCmp('crd_tran_tot').setValue((vTranAmt + vAmt));
            vAmt = 0;
        }                
    }
}

问题公式为vAmt = (vRate / ((vTranAmt / 100) + 1));

另一个公式运行良好。

示例输入是 100,增值税率为 14.00,预期的答案是税额 14,尽管它给出的是 7!!!

我们正在使用 EXTJS、js 和 C# 的混搭...

任何帮助将不胜感激。

亲切的问候

尼克

【问题讨论】:

  • Ext.getCmp('vatable').getValue().toString()的值是多少?
  • 等等,14 / (100/100 + 1) = 7 不正确吗?
  • 它是 Y 或 N,取决于它是包含增值税还是不包含增值税...
  • @Zach: 7 是正确的......不过他仍然有整数除法问题
  • 不是整数除法,修正整数除法还是7。公式不正确

标签: c# javascript math extjs


【解决方案1】:

您可能会使用以下代码成为integer division 的牺牲品:

vAmt = (vRate / ((vTranAmt / 100) + 1));

您应该将公式更改为以下内容以避免混淆:

vAmt = (vRate / ((vTranAmt / 100.0) + 1.0));

但是,使用您提供的数字,为 vTranAmt 插入 100,为 vRate 插入 14 不会有整数除法问题,但会给您 7:

vAmt = (14 / ((100 / 100) + 1))
     = (14 / ((1        ) + 1))
     = (14 / (2              ))
     = (7                     )

所以要么你的公式不正确,要么 7 是正确答案。

【讨论】:

    【解决方案2】:

    公式不正确,应该是

    vAmt = vTranAmt * (vRate / 100.0d);
    

    【讨论】:

    • 感谢一百万...解决了它!仍然不知道为什么它可以在 excel 中工作!
    • 不客气,我从事零售软件多年,你记得的真是太棒了。 . .
    • 这是他在 else 案例中的公式 - if 案例试图做什么?
    • 我们也可以在房子里得到一个 100.0 吗?让我们不要享受可能会因语言而蔓延的整数除法问题。
    【解决方案3】:

    我想到了两件事。首先,不要使用“var”,而是使用小数或特定的东西。这样做的原因是编译器将根据变量的数据类型来决定您是指整数除法还是十进制除法。如果它选择整数,它可能会代表您进行一些意外的舍入。第二件事是确保从那些 .getCmp() 调用中正确获取变量值。

    【讨论】:

      【解决方案4】:

      解释一下:

      公式:

      vAmt = (vRate / ((vTranAmt / 100) + 1));
      

      参数:

      vRate = 14
      vTranAmt = 100
      

      替补:

      vAmt = (14 / ((100 / 100) + 1));
      

      微积分:

      vAmt = (14 / (1 + 1));
      

      微积分:

      vAmt = (14 / (2));
      

      微积分:

      vAmt = (14 / 2);
      

      微积分:

      vAmt = (7);
      

      所以 7 是预期的答案。

      但你可以重写

      vAmt = 100 * vRate / (vTranAmt + 100); 
      

      【讨论】:

        【解决方案5】:

        我猜这是由于整数和浮点数之间的差异。

        试试这样:

        vAmt = (vRate / ((vTranAmt / 100.0) + 1.0));
        

        【讨论】:

          【解决方案6】:

          您确定公式在 Excel 中是相同的并且在那里有效吗?我不确定你到底想做什么,但你除以vTranAmt,所以这个值越大,结果越小。这听起来不对,如果结果应该是一些税额......

          编辑:很可能您已经切换了vRatevTranAmt 变量。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2017-04-29
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2014-02-24
            • 1970-01-01
            • 2016-03-30
            相关资源
            最近更新 更多