JavaScript 中的数字截断

ES6 引入的 Math.trunc() 方法用于截断浮点数并返回其整数部分。此函数不进行任何舍入,它只是删除小数点后的所有数字。

const number = 100.6

// 旧方法
number < 0 ? Math.ceil(number) : Math.floor(number) // 100

// ES6 方法
const es6 = Math.trunc(number) // 100

Math.trunc() 的运行方式很简单,它只是截断其右边的点和数字。不管参数是正数还是负数。

Math.trunc(100.1) // 100
Math.trunc(100.12) // 100
Math.trunc(100.123) // 100

Math.trunc(-100.1) // -100

我们来看一些非数字参数的例子:

Math.trunc('100.1') // 100
Math.trunc('hello') // NaN
Math.trunc(NaN) // NaN
Math.trunc(undefined) // NaN
Math.trunc() // NaN

使用 parseInt 进行数字截断

我们使用 parseInt 也可以得到类似的结果:

parseInt(100.1) // 100
parseInt(-100.1) // -100

parseInt('100.1') // 100
parseInt('hello') // NaN
parseInt(undefined) // NaN
parseInt() // NaN

Math.trunc()parseInt() 选择

parseInt 主要用于字符串参数。所以如果你在处理数字,最好使用 Math.trunc()

使用 parseInt 的问题

使用 parseInt 时可能会遇到问题。当您传入一个不是字符串的参数(在本例中是数字)时,它将首先使用 toString() 抽象操作将值转换为字符串。大多数情况下,parseInt 很好。但让我们看一个可能不是这样的例子。

const number = 1000000000000000000000.5

console.log(parseInt(number)) // 1 <-- 😱

为什么会出现这种情况?

这是因为我们的参数不是 string,所以 parseInt 做的第一件事就是将参数转换为 string

const number = 1000000000000000000000.5

console.log(number.toString()) // "1e+21"

所以当它试图从 1e+21 中获取整数时,它只知道获取 1 值。所以,使用 parseInt 肯定有其道理。由于这种边缘情况,您可能需要考虑使用 Math 函数。

浏览器支持

大多数现代浏览器都支持 Math.trunc()。除了 Internet Explorer。以下是 Math.trunc() 的支持情况:

Math.trunc()

如果您需要对旧浏览器的支持,请使用旧方法。

其他解决方案

位运算符

双位非 ~~ —— 用于去掉小数部分,因为位运算的操作值要求是整数,其结果也是整数,所以经过位运算的都会自动变成整数。

console.log(~~100.6) // 100

一个 ~ 是按位取反运算,两个 ~~ 也就是取反两次。

按位或 | —— 在每个位位置返回 1,其中一个或两个二进制操作数的对应位为 1。

console.log(100.6 | 0) // 100

详细换算可查看 MDN:Bitwise OR (|)

Number.prototype.toFixed()

Number.prototype.toFixed() 方法使用定点表示法来格式化一个数值,允许您控制小数

(100.645).toFixed() // "100"

// 此方法返回一个字符串,但我们可以再次将其转换为数字:
Number((100.645).toFixed()) // 100
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值