在VB.NET中移植JavaScript函数
我正在尝试将这个看似简单的JavaScript函数移植到VB.NET:在VB.NET中移植JavaScript函数,javascript,vb.net,Javascript,Vb.net,我正在尝试将这个看似简单的JavaScript函数移植到VB.NET: function getFractionalBits(n) { return ((n - (n | 0)) * 0x100000000) | 0; } 该函数取自 我得到的结果相当简单: Public Shared Function GetFractionalBits(n As Double) As Long Return (((n Or 0) - 1) * &H100000000) Or 0 En
function getFractionalBits(n) {
return ((n - (n | 0)) * 0x100000000) | 0;
}
该函数取自
我得到的结果相当简单:
Public Shared Function GetFractionalBits(n As Double) As Long
Return (((n Or 0) - 1) * &H100000000) Or 0
End Function
请注意,我将n-(n | 0)
更改为n-((n或0)-1)
,因为我注意到VB.NET中的结果相差1。诚然,我不知道为什么
对于许多输入,它给出与JavaScript函数相同的结果。然而,对于一些输入,我得到的结果与应该得到的结果相差一倍。例如,78.9
在这两种情况下都返回-429496730
,但是78.6
在VB.NET中返回-1717986918
,在JavaScript中返回-1717986919
。在我尝试过的所有测试用例中,它的关闭次数从未超过1次
我决定进行调查,发现前面提到的表达式,n-(n | 0)
和n-((n或0)-1)
返回的值非常微小——在JavaScript中,第一个返回的值0.59999999999943
。在VB.NET中,第二个返回0.5999999994
。尽管两者都是64位浮点数,但它的精确度似乎稍差一些
我试着用另一种更简单的方法得到分数部分,方法是做n-Math.Floor(n)
。然而,这并不准确;最后3个仍然不见了
我可能做错了什么?这只是一个猜测,但您是否尝试将
n改为十进制
,将n改为双精度
?事实上,是的。我正在修改它,因为我打了这个问题,忘记了改变问题反映了这一点。我现在已经更新了它。我得到了与JS函数的精确端口((n-(n或0))*&H100000000)或0
以及另一种方法(n-math.天花(n))*&H100000000
相同的结果。除了在JS和.NET Framework之间处理这些计算的不同方法之外,我看不到其他解释,这在精度上是有限的。如果关闭选项Strict,我无法重现您的示例结果。代码没有使用选项Strict On进行编译,因此我只能猜测代码中的其他地方存在更多变量类型不匹配。您声明您使用了n-((n或0)-1)
,但显示的代码中没有使用(尽管如此,我还是尝试了这两种方法)。也许这本书对你有用。