我试图将这个看似简单的JavaScript函数移植到VB.NET:
function getFractionalBits(n) {
return ((n - (n | 0)) * 0x100000000) | 0;
}
该功能取自here。
我最终得到的结论相当简单:
Public Shared Function GetFractionalBits(n As Double) As Long
Return (((n Or 0) - 1) * &H100000000) Or 0
End Function
请注意,我已将n - (n | 0)
更改为n - ((n Or 0) - 1)
,因为我注意到VB.NET中的结果与1不同。不可否认,我不确定原因。
对于许多输入,它提供与JavaScript函数相同的结果。但是,对于某些输入,我得到的结果是它应该是什么。例如,78.9
在两种情况下都返回-429496730
,但78.6
在VB.NET中返回-1717986918
,在JavaScript中返回-1717986919
。在我尝试过的所有测试用例中,它从不超过1。
我决定进行调查,发现前面提到的表达式n - (n | 0)
和n - ((n Or 0) - 1)
返回的值略有不同 - 在JavaScript中,第一个返回0.5999999999999943
。在VB.NET中,第二个返回0.599999999999994
。尽管两者都是64位浮点数,但它似乎略微不那么精确。
我尝试通过n - Math.Floor(n)
以另一种更简单的方式获取小数部分。但是,它并不准确;最后3个仍然缺失。
我可能做错了什么?