Математическая формула не дает такой же ответ в C #, как в Excel, или калькулятор - PullRequest
1 голос
/ 02 февраля 2009

Я пытался использовать формулу, которая используется для расчета эксклюзивного НДС в программе, которую создает наша команда. Формула работает правильно, когда используется в калькуляторе или в 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 # ...

Любая помощь будет принята с благодарностью.

С уважением

Ник

Ответы [ 6 ]

7 голосов
/ 02 февраля 2009

Вы, вероятно, станете жертвой целочисленного деления со следующим кодом:

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

Вам следует изменить формулу на следующую, чтобы избежать путаницы:

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

Однако, используя введенные вами числа, подключение 100 для vTranAmt и 14 для vRate не будет иметь проблем с целочисленным делением, но даст вам 7:

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

Значит, либо ваша формула неверна, либо правильный ответ 7.

3 голосов
/ 02 февраля 2009

Формула неверна, она должна быть

vAmt = vTranAmt * (vRate / 100.0d);
3 голосов
/ 02 февраля 2009

На ум приходят две вещи. Во-первых, вместо использования 'var' используйте десятичную или что-то конкретное. Причина этого заключается в том, что компилятор решит, имели ли вы в виду целочисленное или десятичное деление, основываясь на типах данных переменных. Если он выбирает целое число, возможно, он выполняет неожиданное округление от вашего имени. Второе - убедиться, что все значения переменных правильно извлекаются из этих вызовов .getCmp ().

1 голос
/ 02 февраля 2009

Просто, чтобы объяснить:

Формула:

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); 
0 голосов
/ 02 февраля 2009

Вы уверены, что формула такая же в Excel, и она работает там? Я не уверен, что именно вы пытаетесь сделать, но вы делите на vTranAmt, поэтому, чем больше это значение, тем меньше результат. Это звучит неправильно, если предполагается, что результатом будет некоторая сумма налога ...

Редактировать: Скорее всего, у вас есть переменные vRate и vTranAmt.

0 голосов
/ 02 февраля 2009

Я предполагаю, что это из-за разницы между целыми числами и числами с плавающей точкой.

Попробуйте это так:

vAmt = (vRate / ((vTranAmt / 100.0) + 1.0));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...