1

私たちのチームが作成しているプログラムで、排他的 VAT を計算するために使用される式を使用しようとしています。この数式は、電卓や 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));

他の式は完全に機能しています。

入力例は、VAT 税率 14.00 の 100 であり、期待される答えは税額 14 ですが、7 となります!!!

EXTJS、js、C# のマッシュアップを使用しています...

どんな助けでも大歓迎です。

敬具

ニック

4

6 に答える 6

7

次のコードを使用すると、おそらく整数除算の餌食になるでしょう。

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 が正解です。

于 2009-02-02T15:01:58.683 に答える
3

数式が正しくありません。

vAmt = vTranAmt * (vRate / 100.0d);
于 2009-02-02T15:07:40.403 に答える
3

2つのことが思い浮かびます。まず、「var」を使用する代わりに、10 進数または特定のものを使用します。これは、変数のデータ型に基づいて、コンパイラが整数除算または 10 進除算のどちらを意図しているかを判断するためです。整数を選択する場合、予期しない丸めを行っている可能性があります。2 つ目は、これらの .getCmp() 呼び出しから変数値がすべて正しくフェッチされていることを確認することです。

于 2009-02-02T15:01:36.627 に答える
1

説明するだけです:

方式:

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); 
于 2009-02-02T15:04:26.963 に答える
0

数式はExcelでも同じで、そこで機能しますか?あなたが何をしようとしているのか正確にはわかりませんが、あなたはで割っているvTranAmtので、この値が大きいほど、結果は小さくなります。結果がいくらかの税額であると思われるならば、それは正しく聞こえません...

編集:おそらく、変数vRatevTranAmt変数が切り替えられています。

于 2009-02-02T15:06:48.783 に答える
0

整数と浮動小数点数の違いによるものだと思います。

次のようにしてみてください。

vAmt = (vRate / ((vTranAmt / 100.0) + 1.0));
于 2009-02-02T15:01:05.643 に答える