抽奖页面随机发优惠券,代码里一行Math.floor(Math.random()*100),测试却有人反馈负数结果不对——floor是向下取整,不是四舍五入,负数会变得更负,这个坑十个人里八个踩过。

基本规则:朝更小的方向取整

Math.floor(4.9)得4,Math.floor(-4.1)得-5,方向永远朝数轴左边,负小数取整后比原数还小。对照着记三个:Math.round四舍五入,Math.ceil向上取整,Math.floor向下取整。Python里也有对应的math.floor(-4.1),结果同样是-5,先import math再调用,别和round混了。

最常见的几个用法

随机整数:Math.floor(Math.random()*10)得到0到9,要m到n的范围就先乘跨度再加起点。时间换算:90分钟折小时,Math.floor(90/60)得1,余数用取模90%60得30。分页算总页数别用floor,3.2页要进位成4页,该用Math.ceil(总数/每页条数)。金额显示保留两位小数用toFixed(2)更直接,floor会把分直接砍掉。

两个经典的坑

浮点误差:Math.floor(0.57*100)结果可能是56,因为0.57乘100实际得到56.99999,二进制存不精确。跟钱有关的运算先toFixed或转成整数算,再套floor。另一个是parseInt别当取整用:parseInt(-4.9)得-4,它是解析字符串并截断小数部分,负数行为和floor完全不同,混用就是bug来源。

记一条就够用:floor永远往更小的整数走。顺带认一下Math.trunc,它纯粹砍掉小数部分,Math.trunc(-4.9)得-4,需要截断就用它,别再错拿floor。碰到负数、浮点乘法多留个心眼,拿不准就console.log把中间值打出来看一眼再定。