Visual Basic和Javascript之间的舍入误差

我在一个Excel文件中find一个VB脚本来实现Runge-Kutta积分来求解一个微分方程。 我把这个实现一行一行地转换成Javscript。 但是,Javascript程序并没有像VB那样产生完全相同的结果……这些数字已经足够接近于可以接受的程度,但是我相信VB的实现是正确的,因为它是博士论文的一部分。 所以这让我相信我在NodeJS上运行的Javascript实现受到一些四舍五入的影响。

特别是,我注意到,当我不断地加0.01到我的时间计数器,值最终不能被正确地表示,并且我得到像5.299999999999999934而不是5.3值。 这对我来说是有道理的,因为我已经在一些书中读到了Javascript的怪癖。

我的问题是

我的观察是否正确,Visual Basic不会遭受同样的精度缺点?

这是否意味着简单的香草JavaScriptmath本质上比普通香草VBmath更不准确? (不使用其他math库)。

如果我把我的时间variables夹紧,如在强制值为5.30,而不是5.299999999,这实际上会使我的结果更正确吗?

编辑:使用Math.round(X*100)/100钳位将所有时间值的输出更改为只有2个小数位,但实际上并没有改变任何计算的值。

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

如果VB中的计算在其计算中使用Doubletypes的数字,则它应该与JavaScript中的等效计算具有相同的精度和精度。

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

您应该阅读David Goldberg的优秀文章“每个计算机科学家应该知道什么是浮点运算” 。

错误乘法的概率随着总和次数的增加而增加,并且像龙格库塔这样的技术中有很多总和,因此必须非常小心地构buildalgorithm以考虑到这一点。 关于这个主题的权威书籍是经过时间考验的Numerical Recipes ,涵盖了Runge-Kutta,并考虑到了浮点错误。