C# 和 javascript 之间的计算结果不同
Calculations does not show same results between C# and javascript
我正在尝试将代码从 C# 转换为 javascript。
我已经完成了这 2 个测试函数,其中我在循环中进行了计算。原始代码是 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;
}
您可以使用.toFixed
方法四舍五入到一个精度。您的 MathRound
方法 returns 不同的值。
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()
片段
TESTNUMBER = Math.Round(TESTNUMBER, 8);
正在使用 MidpointRounding.ToEven 舍入,而您的函数
function MathRound(num, nrdecimals) {
nrdecimals = Math.pow(10, nrdecimals);
return Math.floor(num * nrdecimals) / nrdecimals;
}
是否向下舍入
我正在尝试将代码从 C# 转换为 javascript。
我已经完成了这 2 个测试函数,其中我在循环中进行了计算。原始代码是 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;
}
您可以使用.toFixed
方法四舍五入到一个精度。您的 MathRound
方法 returns 不同的值。
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()
片段
TESTNUMBER = Math.Round(TESTNUMBER, 8);
正在使用 MidpointRounding.ToEven 舍入,而您的函数
function MathRound(num, nrdecimals) {
nrdecimals = Math.pow(10, nrdecimals);
return Math.floor(num * nrdecimals) / nrdecimals;
}
是否向下舍入