计算在C#和javascript之间没有显示相同的结果

问题描述 投票:0回答:2

我正在尝试将代码从C#转换为javascript。

我做了那两个测试功能,我在循环中进行计算。原始代码是C#代码。但似乎计算结果并不相同。

它与浮点数,双精度和舍入行为有关。但我无法弄清楚出了什么问题。

我的问题应该是如何将这个C#代码转换为javascript以产生相同的结果?

在循环周期:100-102,如下所示,它们开始显示不同的结果: C# 1.5E-08 ___ 100 3.01E-08 101 ___ 4.53E-08 102 ___

JavaScript的 1.500000000000002e-8 ___ 100 1.505e-08 ___ 101 1.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代码

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; 
}
javascript c# double rounding calculation
2个回答
0
投票

您可以使用.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()

0
投票

片段

TESTNUMBER = Math.Round(TESTNUMBER, 8);

正在使用MidpointRounding.ToEven舍入您的功能

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

四舍五入

© www.soinside.com 2019 - 2024. All rights reserved.