Расчеты не показывают одинаковые результаты между C # и JavaScript - PullRequest
0 голосов
/ 24 марта 2019

Я пытаюсь преобразовать код из C # в javascript.

Я выполнил те две тестовые функции, где я делаю вычисления в цикле.Оригинальный код - это код C #.Но похоже, что расчеты не показывают те же результаты.

Это связано с тем, как ведет себя плавание, удвоение и округление.Но я не могу понять, что происходит не так.

Мой вопрос должен заключаться в том, как мы можем преобразовать этот код C # в javascript, чтобы получить те же результаты?

В цикле цикла: 100-102, как видно ниже, они начинают показывать разные результаты: C #1.5E-08 ___ 1003.01E-08 ___ 1014.53E-08 ___ 102

JavaScript1.500000000000002e-8 ___ 1001.505e-08 ___ 1011.51e-08 ___ 102

C # код

void csharpfunction() {

    double TESTNUMBER = 0; List<double> procentLIST = new List<double>(); 
    for (double i = 0; i < 300; i += 0.5) { procentLIST.Add(i); }
    TESTNUMBER = Convert.ToDouble("0.00000001"); 

    for (int t = 0; t < procentLIST.Count; t++)
    {
        TESTNUMBER = TESTNUMBER * (1 + (procentLIST[t] / 100)); 
        listBox1.Items.Add(TESTNUMBER.ToString() + "___" + t);

        TESTNUMBER = Math.Round(TESTNUMBER, 8);
    }
}

Javascript Code

function javascriptfunction() {

    var TESTNUMBER = 0; var i; var t; var procentLIST = [];
    for (i = 0; i < 300; i += 0.5) { procentLIST.push(i); }
    TESTNUMBER = ConvertToDouble("0.00000001"); 

    for (t = 0; t < procentLIST.length; t++) {

        TESTNUMBER = TESTNUMBER * (1 + (procentLIST[t] / 100)); 
        console.log(TESTNUMBER, "_____", t);

        TESTNUMBER = MathRound(TESTNUMBER, 8);
    }
}
function ConvertToDouble(x) {
    return Number.parseFloat(x).toFixed(16);
}
function MathRound(num, nrdecimals) {
    nrdecimals = Math.pow(10, nrdecimals);
    return Math.floor(num * nrdecimals) / nrdecimals; 
}

Ответы [ 2 ]

0 голосов
/ 24 марта 2019

фрагмент

TESTNUMBER = Math.Round(TESTNUMBER, 8);

использует MidpointRounding.ToEven округление, в то время как ваша функция

function MathRound(num, nrdecimals) {
    nrdecimals = Math.pow(10, nrdecimals);
    return Math.floor(num * nrdecimals) / nrdecimals; 
}

выполняет округление вниз

0 голосов
/ 24 марта 2019

Вы можете использовать метод .toFixed для округления с точностью. Ваш метод MathRound возвращает разные значения.

function javascriptfunction() {
    var TESTNUMBER = 0; var i; var t; var procentLIST = [];
    for (i = 0; i < 300; i += 0.5) { procentLIST.push(i); }
    TESTNUMBER = ConvertToDouble("0.00000001"); 

    for (t = 0; t < procentLIST.length; t++) {

        TESTNUMBER = TESTNUMBER * (1 + (procentLIST[t] / 100)); 
        console.log(TESTNUMBER.toExponential(2), "_____", t);

        TESTNUMBER = +TESTNUMBER.toFixed(8);
    }
}

function ConvertToDouble(x) {
    return Number.parseFloat(x).toFixed(16);
}

javascriptfunction()
...