我正在将一个库从javascript翻译成C#,并在这种情况下感受到:
// Javascript
var number = 3144134277.518717 | 0;
console.log(number); // -> -1150833019
从我在其他帖子上看到的内容,它可能被用来舍入值,但在这种情况下,值不是我期望的值(如果它是圆整的),我无法重现C#的行为与:
相同// C#
3144134277.5187168 | 0 // -> Operator '|' cannot be applied to operands
// of type 'double' and 'int'
// or
Convert.ToInt64(3144134277.5187168) | 0 // -> 3144134278
感谢您的帮助!
答案 0 :(得分:6)
|
在javaScript中的工作方式详细in the spec,但主要是你看到|
在按位进行之前隐式将其操作数转换为32位整数OR(这是一个无操作,因为第二个arg是0
)。所以你真正看到的是ToInt32
operation:
ToNumber(argument)
。 (你可以在很大程度上忽略这一点。) NaN
,+0
,-0
,+∞
或-∞
,请返回+0
。floor(abs(number))
。所以在C#中,我认为大概是这样的:
double value = 3144134277.5187168;
bool negative = value < 0;
long n = Convert.ToInt64(Math.Floor(Math.Abs(value)));
n = n % 4294967296;
n = n > 2147483648 ? n - 4294967296 : n;
int i = (int)n;
i = negative ? -i : i;
Console.WriteLine(i); // -1150833019
...为了清楚起见,详细说明。请注意,该符号不会与规范完全相同的位置添加回结果;当我这样做时,它没有正常工作,这可能与规范&#34; modulo&#34;之间的不同定义有关。和C#&#39; %
运营商。
只需仔细检查,-3144134277.5187168
的这些步骤会为您提供1150833019
,这也应该是正确的。