在C#的数值计算场景中,浮点数的取整操作非常常见,Math.Floor是专门用于向下取整的静态方法,它会返回小于或等于指定浮点数的最大整数值,属于System命名空间下的Math类成员。

Math.Floor函数的基本定义
Math.Floor的函数签名根据输入类型不同有多个重载,常用的两个重载如下:
- 处理double类型:public static double Floor(double d);
- 处理decimal类型:public static decimal Floor(decimal d);
该函数返回的结果类型是和输入类型一致的,不会自动转换为整数类型,这一点和很多开发者的预期不同。
基础使用示例
下面通过简单的代码示例展示Math.Floor对正数和负数的处理效果:
using System;
class Program
{
static void Main()
{
// 正数浮点数测试
double positiveNum1 = 3.2;
double positiveNum2 = 3.9;
Console.WriteLine($"Math.Floor({positiveNum1}) 结果:{Math.Floor(positiveNum1)}"); // 输出3
Console.WriteLine($"Math.Floor({positiveNum2}) 结果:{Math.Floor(positiveNum2)}"); // 输出3
// 负数浮点数测试
double negativeNum1 = -3.2;
double negativeNum2 = -3.9;
Console.WriteLine($"Math.Floor({negativeNum1}) 结果:{Math.Floor(negativeNum1)}"); // 输出-4
Console.WriteLine($"Math.Floor({negativeNum2}) 结果:{Math.Floor(negativeNum2)}"); // 输出-4
// decimal类型测试
decimal decimalNum = 5.8m;
Console.WriteLine($"Math.Floor({decimalNum}) 结果:{Math.Floor(decimalNum)}"); // 输出5
}
}
和其他取整方法的差异对比
C#中还有Math.Ceiling、Math.Round等取整方法,和Math.Floor的行为有明显区别,具体差异如下表:
| 方法名 | 取整规则 | 示例输入3.2 | 示例输入3.9 | 示例输入-3.2 |
|---|---|---|---|---|
| Math.Floor | 向下取整,取小于等于目标值的最大整数 | 3 | 3 | -4 |
| Math.Ceiling | 向上取整,取大于等于目标值的最小整数 | 4 | 4 | -3 |
| Math.Round | 四舍五入取整,遵循银行家舍入规则 | 3 | 4 | -3 |
使用注意事项
返回类型不是整数类型
Math.Floor返回的是和输入一致的浮点类型,如果需要整数结果,需要手动进行类型转换,转换时要注意数值范围,避免溢出:
double num = 4.7; // 错误写法:直接赋值给int会编译报错 // int result = Math.Floor(num); // 正确写法:先转换再赋值 int result = (int)Math.Floor(num); Console.WriteLine(result); // 输出4
处理特殊浮点值的情况
如果输入的是NaN、正无穷大、负无穷大,Math.Floor会返回对应的特殊值:
double nanValue = double.NaN; double positiveInfinity = double.PositiveInfinity; double negativeInfinity = double.NegativeInfinity; Console.WriteLine(Math.Floor(nanValue)); // 输出NaN Console.WriteLine(Math.Floor(positiveInfinity)); // 输出PositiveInfinity Console.WriteLine(Math.Floor(negativeInfinity)); // 输出NegativeInfinity
精度问题的影响
由于浮点数本身存在精度误差,部分看起来是整数的浮点数可能实际存储值略小,导致Math.Floor的结果不符合预期:
double num = 1.0 / 10 * 10; // 理论上是1.0,实际存储可能是0.9999999999999999 Console.WriteLine(Math.Floor(num)); // 输出0,不符合预期 // 这种情况可以先对数值进行适当精度处理再取整 double processedNum = Math.Round(num, 10); Console.WriteLine(Math.Floor(processedNum)); // 输出1
常见应用场景
Math.Floor常用于需要严格向下取整的业务场景,比如分页计算中计算总页数,当总条数不能整除每页条数时,总页数需要向下取整后再加1:
int totalCount = 25; int pageSize = 10; // 计算完整页数 int fullPageCount = (int)Math.Floor((double)totalCount / pageSize); // 计算总页数 int totalPage = totalCount % pageSize == 0 ? fullPageCount : fullPageCount + 1; Console.WriteLine(totalPage); // 输出3
C#Math_Floor向下取整浮点数修改时间:2026-07-08 17:30:28