0

0

c++ ceil和floor函数_c++向上取整与向下取整

裘德小鎮的故事

裘德小鎮的故事

发布时间:2026-01-03 09:18:55

|

851人浏览过

|

来源于php中文网

原创

ceil 和 floor 函数需包含 ,参数隐式转 double,整数除法如 ceil(10/3) 错误因先整除得 3;安全整数向上取整用 (a + b - 1) / b(正数)或 std::ceil(static_cast(a)/b)。

c++ ceil和floor函数_c++向上取整与向下取整

ceil 和 floor 函数必须包含 ,且参数为 double 或可隐式转为 double 的类型

直接调用 ceil(3)floor(5) 看似没问题,但实际是调用 double ceil(double) 的重载版本。C++ 标准库中没有 int 版本的 ceil/floor,传入整数会触发隐式转换,看似能编译,但容易掩盖精度问题或误用场景。

常见错误现象:ceil(10 / 3) 返回 3.0(不是 4.0),因为 10 / 3 是整数除法,结果为 3,再转 double 后取整仍是 3.0

  • 务必确保被取整的表达式本身已是浮点运算,例如写成 ceil(10.0 / 3)ceil(static_cast(10) / 3)
  • 若操作数是 float,会先提升为 double;C++11 起也提供 ceilllong double)和 ceilffloat),需显式调用
  • 头文件只认 是 C 风格,不推荐在 C++ 中使用

向上取整常见写法:避免依赖 ceil 处理整数除法

对两个正整数 ab 求「向上取整的商」(即 ⌈a/b⌉),用 ceil(static_cast(a)/b) 简单但有隐患:当 ab 很大时,double 可能无法精确表示,导致取整错误(例如 a = 2^53 + 1double 中与 2^53 无法区分)。

更安全、无精度损失的整数解法:

立即学习C++免费学习笔记(深入)”;

int ceil_div(int a, int b) {
    if (b == 0) return 0; // 或抛异常
    if (a == 0) return 0;
    if ((a > 0) == (b > 0)) {
        // 同号:(a + b - 1) / b,但要防溢出
        return (a + (b - 1)) / b;
    } else {
        // 异号:C++11 起整数除法向零取整,直接用负数处理更稳妥
        return a / b - (a % b != 0 ? (a > 0 ? 1 : 0) : 0); // 建议改用标准库 std::div 或分情况
    }
}

实际项目中更推荐用:

MedPeer
MedPeer

AI驱动的一站式科研服务平台

下载
  • 仅限正整数时:`(a + b - 1) / b`(简洁高效,但注意 a + b - 1 可能溢出)
  • 需要通用性时:用 std::lround(std::ceil(static_cast(a)/b)) 提升精度,或引入 类库辅助

floor 在负数除法中的行为易被误解

C++ 整数除法向零取整(-7 / 3 == -2),而 floor(-7.0 / 3.0)-3.0 —— 二者结果不同。这是最常踩的坑:误以为 floor(a / b) 和整数除法等价。

示例对比:

int a = -7, b = 3;
std::cout << a / b << "\n";           // 输出 -2(向零)
std::cout << floor(a * 1.0 / b) << "\n"; // 输出 -3(向下)
std::cout << ceil(a * 1.0 / b) << "\n";  // 输出 -2(向上)
  • 若目标是「向负无穷取整」,必须用 floor,不能依赖 /
  • 若目标是「截断小数部分」(即向零),直接用整数除法更高效、无浮点误差
  • floor 对负数输入返回更小的整数,例如 floor(-2.1) == -3.0,不是 -2.0

编译器与 IEEE 754 兼容性影响结果一致性

虽然 中的 ceil/floor 行为由 IEEE 754 定义,但某些嵌入式平台或老编译器(如早期 MSVC)可能未完全遵循,尤其在 long double 模式下。

实操建议:

  • 跨平台项目中,避免对 ceil/floor 的返回值做位级比较(如 == 判断是否为整数),改用 std::abs(x - std::round(x))
  • 启用 -frounding-math(GCC/Clang)或检查浮点控制字(MSVC)以确保舍入模式为默认的“就近舍入”,否则 ceil/floor 可能被优化掉或行为异常
  • 单元测试中应覆盖边界值:ceil(0.0)floor(-0.0)ceil(INFINITY)floor(NAN) —— 后两者分别返回对应无穷和 NaN,不抛异常

真正麻烦的不是函数怎么写,而是你没意识到它背后连着整个浮点环境和整数溢出链。

相关文章

c++速学教程(入门到精通)
c++速学教程(入门到精通)

c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
css中float用法
css中float用法

css中float属性允许元素脱离文档流并沿其父元素边缘排列,用于创建并排列、对齐文本图像、浮动菜单边栏和重叠元素。想了解更多float的相关内容,可以阅读本专题下面的文章。

554

2024.04.28

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

95

2025.10.23

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

313

2023.08.02

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

522

2024.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

190

2025.08.29

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

49

2025.08.29

C++中int、float和double的区别
C++中int、float和double的区别

本专题整合了c++中int和double的区别,阅读专题下面的文章了解更多详细内容。

95

2025.10.23

php源码安装教程大全
php源码安装教程大全

本专题整合了php源码安装教程,阅读专题下面的文章了解更多详细内容。

150

2025.12.31

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 5.9万人学习

C 教程
C 教程

共75课时 | 3.8万人学习

C++教程
C++教程

共115课时 | 10.9万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号