HOWTO · JavaScript
如何在 JavaScript 中将浮点数转换为整数
了解如何截断或舍入 JavaScript 的 Number、解析十进制文本,并避免不安全的位运算简写。
本页内容
JavaScript 没有单独的 int 和 float 类型,两者通常都由 Number 表示。要移除现有数值的小数部分,请使用向零截断的 Math.trunc()。这种操作称为向零截断:
console.log(Math.trunc(12.75));
console.log(Math.trunc(-12.75));
输出:
12
-12
正确的方法取决于你需要的结果:
- 使用
Math.trunc(value)向零丢弃小数部分。 - 需要指定舍入方向时使用
Math.floor(value)或Math.ceil(value)。 - 使用
Math.round(value)选择最接近的整数。 - 输入是十进制文本时使用
parseInt(text, 10),不要默认用它截断Number。
使用 Math.trunc() 截断数字
Math.trunc() 返回数字的整数部分而不进行舍入。对于正数,它会移除小数点后的内容;对于负数,它向零移动,因此 -12.75 会变成 -12,而不是 -13。
const value = -12.75;
console.log(Math.trunc(12.75));
console.log(Math.trunc(value));
输出:
12
-12
当值已经是数字且要求“保留整数部分”时,这通常是最清晰的选择。介于 -1 和 0 之间的值可能产生负零:
console.log(Object.is(Math.trunc(-0.5), -0));
输出:
true
如果应用必须区分 -0 和 0,请显式处理这种情况。
使用 floor()、ceil() 或 round() 进行舍入
截断和舍入是不同的操作。Math.floor() 返回小于或等于该值的最大整数,Math.ceil() 返回大于或等于该值的最小整数。对于负数,这种差异尤其重要:
const value = -12.75;
console.log(Math.floor(value));
console.log(Math.ceil(value));
console.log(Math.round(-1.5));
输出:
-13
-12
-1
下限使用 Math.floor(),上限使用 Math.ceil(),需要最近整数时使用 Math.round()。JavaScript 的 Math.round() 在相等距离时向正无穷方向处理,所以 Math.round(-1.5) 返回 -1。
使用 parseInt() 解析十进制文本
当源数据是字符串时,parseInt() 可以解析其整数前缀。对于十进制文本,请将基数设为 10:
console.log(parseInt("12.75", 10));
console.log(Number.isNaN(parseInt("not a number", 10)));
输出:
12
true
parseInt() 遵循解析规则,遇到对该基数无效的字符时可能停止。因此它不同于截断现有数字。例如,输入必须先完整转换并验证为数字时,适合使用 Math.trunc(Number("12.75"))。可能出现无效输入时,请使用 Number.isNaN() 或其他验证规则。
不要将 toFixed() 和位运算简写用于一般转换
Number.toFixed() 是格式化方法。它会舍入到指定的小数位数并返回字符串,因此不是通用的整数转换方法:
console.log(typeof (12.75).toFixed(0));
输出:
string
value | 0、~~value 和 value >> 0 等位运算表达式也会向零截断,但它们会先把值转换为有符号的 32 位整数。超出该范围的值可能发生回绕:
console.log(2 ** 31 | 0);
输出:
-2147483648
只有在确实需要有符号 Int32 强制转换时才使用这些表达式。它们并不是更安全或更清晰的 Math.trunc() 替代方案。
需要注意的限制
Number 使用 IEEE 754 双精度浮点表示。整数只有在 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 范围内才能精确表示;精确整数运算很重要时请使用 Number.isSafeInteger(),并显式处理非有限值:
console.log(Math.trunc(Infinity));
console.log(Math.trunc(NaN));
输出:
Infinity
NaN
Math.trunc() 不会把 Infinity、-Infinity 或 NaN 变成有限整数。如果应用要求有限且安全的整数,请验证输入。
总结
对于现有的 JavaScript 数字,如果“整数”表示向零移除小数部分后的值,请从 Math.trunc(value) 开始。需要特定舍入规则时选择 Math.floor()、Math.ceil() 或 Math.round()。十进制文本使用 parseInt(text, 10),记住 toFixed() 会生成格式化文本,并避免使用位运算简写,除非确实需要有符号 32 位强制转换。