在Javascript中将double转换为int而不进行舍入

RSH*_*SH1 55 javascript floating-point int casting

在C#中,以下代码返回2:

double d = 2.9;
int i = (int)d;
Debug.WriteLine(i);
Run Code Online (Sandbox Code Playgroud)

但是,在Javascript中,将我所知道的"double"转换为"int"的唯一方法是使用Math.round/floor/toFixed等.有没有一种方法可以在Javascript中转换为int而不进行舍入?我知道Number()的性能影响,所以我宁愿避免将其转换为字符串,如果可能的话.

kub*_*etz 137

使用parseInt().

var num = 2.9
console.log(parseInt(num, 10)); // 2
Run Code Online (Sandbox Code Playgroud)

你也可以使用|.

var num = 2.9
console.log(num | 0); // 2
Run Code Online (Sandbox Code Playgroud)

  • OR方法似乎工作得很好,并且不依赖于字符串转换 (4认同)
  • 可能想要添加基数(10)作为第二个参数 (2认同)
  • 无法添加它将导致parseInt("09")返回0 (2认同)

Poi*_*nty 52

我发现"parseInt"的建议非常好奇,因为"parseInt" 按设计对字符串进行操作.这就是为什么它的名字里面有"解析"这个词.

完全避免函数调用的技巧是

var truncated = ~~number;
Run Code Online (Sandbox Code Playgroud)

"〜"一元运算符的双重应用将为您提供双精度值的截断版本.但是,该值限制为32位精度,与所有其他JavaScript操作一样,隐含地将数字视为整数(如数组索引和按位运算符).

编辑 - 在一段时间后的更新中,该~~技巧的另一个替代方法是将该值与零按位OR运算:

var truncated = number|0;
Run Code Online (Sandbox Code Playgroud)

  • 这是最好的答案,感谢发布! (3认同)
  • 一个不错的技巧,但不是很可读,所以不推荐用于共享代码库。 (2认同)

Rol*_*and 23

(int)与仅使用标准库的C# 转换类似:

Math.trunc(1.6) // 1
Math.trunc(-1.6) // -1
Run Code Online (Sandbox Code Playgroud)

  • 我不明白为什么它的赞成票这么少,对于那些不每天使用 javascript 的人来说,这似乎是实现这一目标的最直接、最易读的方法。我知道如果我尝试其他答案的“| 0”或“~~”,我将永远不会记得它的作用,并且下次看到它时我会感到困惑。至少你的解决方案是不言自明的。谢谢 ! (4认同)

Jus*_*ner 7

只需使用parseInt()并确保包含基数,以便获得可预测的结果:

parseInt(d, 10);
Run Code Online (Sandbox Code Playgroud)


hug*_*omg 5

int在Javascript中没有这样的东西.所有Numbers这些实际上都是幕后的双打*所以你不能依靠类型系统为你发出一个舍入顺序,就像在C或C#中一样.

您不必担心精度问题(因为双精度正确表示任何最大为2 ^ 53的整数)但如果您想要舍入到最接近的整数,那么您真的很难使用Math.floor(或其他等效技巧).


*大多数JS引擎都可以使用本机int,但所有JS编号中的所有JS引擎仍然必须具有双重语义.

  • 所有JS引擎都可以使用本机int(注意范围不同:V8尤其是特殊情况31位整数).即使是SpiderMonkey,差不多二十年前也会使用原生的int(当它被编写时,桌面计算机通常没有硬件浮点支持,所以这是一个非常必要的性能优化). (2认同)