← JavaScript Math.exp()方法:计算以e为底的指数函数 JavaScript Math.hypot()方法:计算多个数值的平方和的平方根 →

JavaScript Math.floor()方法:向下取整的数值舍入操作

原创 2026-04-13 JavaScript 已有人查阅

Math.floor() 是 JavaScript 中 Math 对象提供的一个静态方法,它的核心功能是将传入的数值向下舍入到最接近的整数。所谓“向下”,在数轴上的含义是朝负无穷方向移动,返回的是小于或等于原数值的较大整数。如果参数本身已经是整数,则原样返回,不做任何更改。

在 Math 对象的取整三兄弟中,Math.floor() 的角色定位很明确:Math.ceil() 往上取,Math.round() 四舍五入,而 Math.floor() 往下取。刚接触 JavaScript 时我曾在处理负数时把这三个方法弄混过,导致分页逻辑在翻到特定数据段时出了偏差。后来养成了一个习惯:凡是涉及负数取整的需求,先在脑子里过一遍数轴,确认“向下”究竟是朝哪个方向移动。这个经验在我后来写游戏地图的网格对齐逻辑时派上了用场。

方法语法

Math.floor(num)

参数说明

num —— 需要被向下舍入的数值。可以是整数、浮点数、正数、负数,以及能够隐式转换为数值的字符串或表达式。

返回值

返回小于或等于参数 num 的较大整数值。简单来说,就是沿着数轴向左(负无穷方向)找到的第一个整数。

代码示例与详细解析

示例一:正浮点数的向下取整

对于正数而言,Math.floor() 的行为相当直观——直接舍去小数部分,保留整数部分。

// 正浮点数的向下取整
console.log(Math.floor(7.2));        // 输出: 7
console.log(Math.floor(0.2));        // 输出: 0
console.log(Math.floor(9.99));       // 输出: 9
console.log(Math.floor(3.01));       // 输出: 3
console.log(Math.floor(5));          // 输出: 5(整数保持不变)
console.log(Math.floor(0));          // 输出: 0

Math.floor(7.2) 返回 7,因为小于 7.2 的较大整数就是 7。Math.floor(0.2) 返回 0,沿着数轴向左从 0.2 移动到 0。即使小数部分非常接近下一个整数,比如 Math.floor(9.99),结果依然是 9 而不是 10。整数参数如 Math.floor(5) 直接返回 5,不做任何改动。

示例二:负数的向下取整——容易混淆的地方

负数的 Math.floor() 行为是很多初学者踩坑的地方。关键在于理解“向下”是指朝负无穷方向移动,在数轴上就是向左移动。因此对于负数来说,“更小”的整数反而是绝对值更大的那个负数。

// 负数的向下取整(注意行为)
console.log(Math.floor(-7.2));       // 输出: -8
console.log(Math.floor(-0.2));       // 输出: -1
console.log(Math.floor(-3.8));       // 输出: -4
console.log(Math.floor(-0.01));      // 输出: -1
console.log(Math.floor(-5));         // 输出: -5(负整数保持不变)

Math.floor(-7.2) 返回 -8。为什么会这样?在数轴上,-7.2 位于 -8 和 -7 之间。朝负无穷方向(向左)移动,遇到的第一个整数是 -8,因此返回 -8。同理,Math.floor(-0.2) 向左移动到 -1,所以返回 -1。Math.floor(-0.01) 同样返回 -1,因为 -0.01 左边最近的整数就是 -1。

个人经验分享:如果你想要的是“朝零方向取整”——也就是直接舍去小数部分、保留整数部分(即截断)——那么对于正数用 Math.floor() 是对的,但对于负数应该用 Math.ceil()。或者更直接的方式是使用 Math.trunc(),这个方法专门用于截断小数部分,无论正负数都朝零方向取整。举例来说,Math.trunc(-7.2) 返回 -7,而 Math.floor(-7.2) 返回 -8。根据实际需求选择合适的方法,能避免很多逻辑错误。

示例三:Math.floor() 在开发中的典型应用

Math.floor() 在日常编程中的使用频率相当高。以下代码展示了几个常见场景。

// 场景一:生成指定范围内的随机整数
function getRandomInt(min, max) {
  // Math.random() 返回 [0, 1) 之间的浮点数
  // Math.floor() 确保结果是整数
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
console.log(getRandomInt(1, 10));    // 输出: 1 到 10 之间的随机整数

// 场景二:计算数组中元素的中间索引(二分查找常用)
const arrayLength = 10;
const midIndex = Math.floor(arrayLength / 2);
console.log(`长度为 ${arrayLength} 的数组,中间索引为: ${midIndex}`); // 输出: 5

// 场景三:分页计算——确定某一项属于第几页
function getPageNumber(itemIndex, itemsPerPage) {
  // itemIndex 从 0 开始计数
  return Math.floor(itemIndex / itemsPerPage) + 1;
}
console.log(getPageNumber(15, 10));   // 输出: 2(第15项在第2页)
console.log(getPageNumber(9, 10));    // 输出: 1(第9项在第1页)

在生成随机整数的场景中,Math.floor() 配合 Math.random() 是经典组合。直接用 Math.round() 会导致首尾两个值出现的概率减半,而 Math.floor() 能确保每个整数被选中的概率均等。在二分查找中,Math.floor() 用于计算中间索引,保证结果是一个有效的整数索引。分页计算里,Math.floor() 配合除法运算能准确判断某项数据落在第几页。

示例四:Math.floor() 与 Math.ceil()、Math.round() 的行为对比

把三个取整方法放在一起比较,能更清晰地看到它们各自的行为边界。

const testValues = [7.2, 7.8, -7.2, -7.8, 0.5, -0.5];

console.log('数值\t\tfloor\tceil\tround');
testValues.forEach(val => {
  console.log(`${val}\t\t${Math.floor(val)}\t${Math.ceil(val)}\t${Math.round(val)}`);
});

// 输出:
// 数值            floor   ceil    round
// 7.2            7       8       7
// 7.8            7       8       8
// -7.2           -8      -7      -7
// -7.8           -8      -7      -8
// 0.5            0       1       1
// -0.5           -1      0       -0

从对比表格中可以看出:

  • 正数 7.2:floor 向下到 7,ceil 向上到 8,round 四舍五入到 7。

  • 负数 -7.2:floor 向下(朝负无穷)到 -8,ceil 向上(朝正无穷)到 -7,round 四舍五入到 -7。

  • 边界值 0.5:floor 到 0,ceil 到 1,round 到 1。

  • 边界值 -0.5:floor 到 -1,ceil 到 0,round 到 -0。

理解这些差异对于编写精确的数值处理逻辑很有必要。

示例五:构建交互式向下取整计算器

下面这段代码实现了一个简单的交互工具,可以输入任意数值并实时查看其 Math.floor() 的结果。这个工具对于验证负数向下取整的行为特别有帮助。

<label for="floorInput">输入一个数值:</label>
<input type="text" id="floorInput" placeholder="例如 7.2 或 -3.8" />
<button onclick="computeFloor()">向下取整</button>
<p>计算结果:<span id="floorResult"></span></p>

<script>
function computeFloor() {
  const inputField = document.getElementById('floorInput');
  const outputSpan = document.getElementById('floorResult');
  const rawInput = inputField.value;
  
  const numericValue = parseFloat(rawInput);
  
  if (!isNaN(numericValue)) {
    const result = Math.floor(numericValue);
    outputSpan.textContent = result;
  } else {
    outputSpan.textContent = '请输入有效的数值';
  }
}
</script>

建议在这个工具里尝试输入几个负数,比如 -0.2、-1.5、-7.2,观察结果与直觉是否一致。这种亲手验证的过程比单纯阅读文档要深刻得多。

本节课程知识要点

  • Math.floor(num) 返回小于或等于 num 的较大整数,即朝负无穷方向舍入。

  • 正数场景下,效果等同于直接舍去小数部分;负数场景下,返回值是绝对值更大的那个负整数。

  • 整数参数直接返回原值,不做改动。

  • 与 Math.ceil() 和 Math.round() 在负数处理上存在明显差异,使用时需根据数轴方向仔细甄别。

  • 如需实现“朝零方向截断小数”的效果,可考虑使用 Math.trunc() 方法。

  • 常见应用场景包括:随机整数生成、数组索引计算、分页逻辑、像素坐标对齐等。

Math.floor() 虽然语法简单,但它在数值处理中的角色相当基础。特别是负数行为这块,一旦理解透彻,后续在处理网格系统、坐标转换、以及各类需要取整的业务算法时,就能快速做出正确的方法选择,减少因取整方向错误导致的计算偏差。

← JavaScript Math.exp()方法:计算以e为底的指数函数 JavaScript Math.hypot()方法:计算多个数值的平方和的平方根 →
分享笔记 (共有 篇笔记)
验证码:
微信公众号