Visual Basic和Javascript之间的舍入错误

Visual Basic和Javascript之间的舍入错误,javascript,vb.net,node.js,excel,vba,Javascript,Vb.net,Node.js,Excel,Vba,我在Excel文件中找到了一个VB脚本,它实现了求解微分方程的龙格-库塔积分。我将实现逐行转换为Javscript。然而,Javascript程序不会产生与VB程序完全相同的结果。。。这些数字非常接近,勉强可以接受,但我相信VB实现是正确的,因为它是一篇博士论文的一部分。因此,这让我相信,在NodeJS上运行的Javascript实现存在一些舍入幽灵 特别是,我注意到,当我不断地将0.01添加到我的时间计数器中时,这些值最终无法正确表示,我得到的值是5.2999999999934,而不是5.3。

我在Excel文件中找到了一个VB脚本,它实现了求解微分方程的龙格-库塔积分。我将实现逐行转换为Javscript。然而,Javascript程序不会产生与VB程序完全相同的结果。。。这些数字非常接近,勉强可以接受,但我相信VB实现是正确的,因为它是一篇博士论文的一部分。因此,这让我相信,在NodeJS上运行的Javascript实现存在一些舍入幽灵

特别是,我注意到,当我不断地将
0.01
添加到我的时间计数器中时,这些值最终无法正确表示,我得到的值是
5.2999999999934
,而不是
5.3
。这对我来说很有意义,因为我在一些书中读到了Javascript的这种怪癖

我的问题是

VisualBasic没有同样的精度缺陷,我的观察是否正确

这是否意味着普通Javascript数学本质上不如普通VB数学准确?(不使用其他数学库)

如果我钳制我的时间变量,如中所示,强制值为5.30,而不是5.29999999,这会使我的结果更加正确吗


编辑:使用
数学。舍入(X*100)/100
钳形将所有“我的时间”值的输出更改为只有两位小数,但实际上不会更改任何计算的值。

JavaScript使用IEEE 754双精度浮点数…就像Visual Basic一样。唯一的区别是JavaScript对所有数字使用双精度(也就是说,它没有整数类型或单精度浮点)

如果VB中的计算在其计算中使用类型为
Double
的数字,则其精度和精度应与JavaScript中的等效计算相同

结果是,VB在数值计算方面绝不比JavaScript更精确。但是,无论何时处理浮点值,都必须小心

你可能应该读大卫·戈德伯格的优秀文章


误差相乘的机会随着求和次数的增加而增加,在诸如龙格-库塔(Runge-Kutta)等技术中有很多求和,因此必须非常仔细地构造算法来考虑这一点。关于这一主题的权威著作是《经过时间考验的书》,该书涵盖了Runge Kutta,并考虑了浮点错误。

JS的数学将不那么精确,如果是这样的话。^感谢您的澄清。由于我不是一名实践者,所以我经常使用错误的单词。你可以乘以,例如100,round或+x.toFixed(2),然后除以100来清除较小的舍入“错误”。