modf函数可安全拆分浮点数为符号相同的整数和小数部分,返回小数部分,整数部分通过指针参数输出;其整数部分等价于trunc(x),非floor或强制转换,且支持NaN、±inf等边界值。
用
拆分浮点数:整数和小数部分直接分离
是 C++
标准库
(
)里专为拆分浮点数设计的函数,它把一个
值分解成符号相同的整数部分和小数部分,并把整数部分通过指针参数返回。这是最安全、最符合 IEEE 754 行为的方式,比强制类型转换或
字符串解析
靠谱得多。
关键点:
不改变原值符号,返回的小数部分与原数同号,整数部分也保留原符号;它处理边界值(如
、
)有明确定义,不会崩溃或未定义行为。
函数原型是
;对
和
,分别用
和
必须指向有效内存,否则行为未定义——常见错误是传入空指针或栈上未初始化的指针变量
返回值是小数部分(
类型),整数部分写入
所指位置
完整示例:正确调用
并验证结果
下面代码演示如何安全提取
的整数与小数部分,并注意输出格式避免精度误导:
}
立即学习
“
C++免费学习笔记(深入)
”;
注意:
是
类型,不是
——它保留了原始精度和符号,不能直接当整型用(比如做数组索引前需显式转换并检查范围)。
C函数速查手册(CHM版)
C函数速查手册(CHM版)
下载
常见错误:为什么
或
不等于
的整数部分?
对负数,三者行为完全不同:
截断得
(C++ 强制转换向零取整)
得
(向下取整)
写入
的是
(整数部分,向零方向的整数值)
也就是说,
的“整数部分”定义是数学上的「截断小数位」,等价于
,不是
也不是类型转换。如果业务逻辑要求向零取整再分离,
就是唯一正解。
兼容性与性能提醒
在所有主流平台(GCC、Clang、MSVC)和 C++11 及以上标准中都可用,无额外依赖。它的开销极低,通常编译器会内联为几条 CPU 指令(尤其在 x86-64 上有专用指令
或类似实现)。
真正容易被忽略的是:如果你要处理
类型,必须用
,传
会导致隐式提升+精度损失;同理,
必须配
。混用类型不会编译报错,但结果可能不符合预期。
modfmodfdoublemodfNaN±infdouble modf(double value, double* iptr)floatlong doublemodffmodfliptrdouble*iptrmodf-3.14159#include
#include
#include
int main() {
double x = -3.14159;
double int_part;
double frac_part = modf(x, &int_part);
std::cout << std::fixed << std::setprecision(5);
std::cout << "原值: " << x << "\n";
std::cout << "整数部分: " << int_part << "\n"; // 输出 -3.00000
std::cout << "小数部分: " << frac_part << "\n"; // 输出 -0.14159
return 0;
int_partdoubleint(int)xfloor(x)modf(int)-3.14159-3floor(-3.14159)-4.0modf(-3.14159, &ip)ip-3.0modftrunc(x)floormodfmodffxtractfloatmodffmodflong doublemodfl