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)
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)
Rol*_*and 23
(int)
与仅使用标准库的C# 转换类似:
Math.trunc(1.6) // 1
Math.trunc(-1.6) // -1
Run Code Online (Sandbox Code Playgroud)
int
在Javascript中没有这样的东西.所有Numbers
这些实际上都是幕后的双打*所以你不能依靠类型系统为你发出一个舍入顺序,就像在C或C#中一样.
您不必担心精度问题(因为双精度正确表示任何最大为2 ^ 53的整数)但如果您想要舍入到最接近的整数,那么您真的很难使用Math.floor(或其他等效技巧).
*大多数JS引擎都可以使用本机int,但所有JS编号中的所有JS引擎仍然必须具有双重语义.
归档时间: |
|
查看次数: |
122721 次 |
最近记录: |