首页 >> 甄选问答 >

问c 语言中 sqrt 取整 开方后整数处理详解

2026-11-08 10:56:00

答

在 C 语言当中 sqrt 函数本身返回的是 double 类型浮点数,它只会计算平方根,不会自动取整,如果想要对 sqrt 的结果做取整,需要搭配取整相关函数或者强制类型转换,常用方式有强制转 int 向下截断,floor 向下取整,ceil 向上取整,round 四舍五入取整,不同取整方式适用场景不一样,很多初学者直接把 sqrt 结果强制转 int,以为就是标准取整,其实这种写法是截断小数部分,并不是四舍五入,而且还要特别注意 sqrt 浮点数存在精度误差,比如本来应该是整数平方根,计算出来变成 8.9999999,强制转 int 之后就变成 8,结果出错,这是 sqrt 取整最经典的坑点。之所以要单独学习 sqrt 取整,是因为很多算法题比如判断完全平方数,求整数开方,都需要拿到整数结果,必须理解浮点数精度带来的误差,选择合适的取整方案,同时所有取整函数都在 math.h 头文件里面,Linux gcc 编译的时候同样需要链接数学库 lm 参数。

基础取整方式说明

第一种 强制类型转换 (int) sqrt (x),原理是直接丢弃小数部分,等价于向下截断,正数场景效果和 floor 一样,只适合正数,小数部分全部砍掉,不会四舍五入。

第二种 floor 函数,floor 返回 double,作用是向下取整,也就是往更小的整数靠拢,比如 9.7 取整得到 9,9.1 也是得到 9。

第三种 ceil 函数,ceil 作用是向上取整,往更大整数靠拢,9.1 取整得到 10。

第四种 round 函数,四舍五入取整,小数大于等于 0.5 就进一位,小于 0.5 直接舍弃小数,这个是日常理解的四舍五入。

完整代码示例

include

include

int main ()

{

int num = 10;

double s = sqrt (num);

int res1 = (int) s;

int res2 = (int) floor (s);

int res3 = (int) ceil (s);

int res4 = (int) round (s);

printf ("强制截断 % d\n",res1);

printf ("向下取整 % d\n",res2);

printf ("向上取整 % d\n",res3);

printf ("四舍五入 % d\n",res4);

return 0;

}

代码里面 num 等于 10,sqrt 结果大约是 3.162,强制截断和 floor 得到 3,ceil 得到 4,round 得到 3。

完全平方数判断的特殊处理

做 sqrt 取整用来判断是不是完全平方数的时候,不能只取整之后再平方对比,因为浮点精度误差会误判,稳妥写法是 sqrt 之后取整,再把取整后的整数平方,和原数字比较,并且可以增加微小误差补偿,避免本来是整数平方根因为浮点误差变成小于整数的值。

示例思路

int n = 16;

int k = (int) sqrt (n);

if (kk == n)

{

printf ("是完全平方数");

}

四种取整方式对比表格

方式函数规则特点
强制转换(int)截断小数简单,正数等价向下取整
向下取整floor向更小整数靠拢标准数学向下取整
向上取整ceil向更大整数靠拢适合向上进位场景
四舍五入round小数 0.5 进位符合日常四舍五入习惯

深度拓展要点

第一 精度误差根源,sqrt 底层是浮点近似运算,不是精确整数运算,当数字很大的时候,double 有效位数有限,会出现偏差,大数场景如果要求严格准确,推荐改用二分法求整数平方根,不依赖 sqrt 函数。

第二 数据类型溢出,如果原数字非常大,取整之后做 k 乘 k 平方运算,int 类型会溢出,这种场景需要换成 long long 类型保存平方结果。

第三 输入合法性,sqrt 参数如果是负数,函数返回 NaN,取整之后没有意义,正式代码要提前判断,如果参数小于零提示非法输入。

第四 返回类型,floor ceil round 返回值依然是 double,所以取整之后还需要再次强制转成 int 或者 long long,不能直接当成整数变量使用。

第五 编译注意,math.h 里面 sqrt floor ceil round,在 Linux gcc 环境编译命令要加上 lm,否则链接报错,Windows VS 环境一般不需要手动添加。

【常见问题】

问题 1 c 语言中 sqrt 取整,强制转 int 是不是四舍五入

回答 1 c 语言中 sqrt 取整,强制转 int 不是四舍五入,它只是直接截断小数部分,只保留整数部分,如果需要四舍五入的 sqrt 取整,要使用 round 函数处理 sqrt 返回值。

问题 2 c 语言中 sqrt 取整,为什么 16 开方取整有时候得到 3

回答 2 c 语言中 sqrt 取整出现这个错误,是 sqrt 浮点数近似精度问题,理论 sqrt (16) 等于 4,但是浮点计算偶尔得到 3.9999999,强制截断之后变成 3,做完全平方判断的时候需要注意这个精度误差。

问题 3 c 语言中 sqrt 取整,ceil 和 floor 分别适合什么场景

回答 3 c 语言中 sqrt 取整,floor 适合需要向下取整的算法,ceil 适合需要向上进位的场景,比如计算容器数量,页数这类必须向上进位的需求,就选择 ceil 处理 sqrt 结果。

问题 4 c 语言中 sqrt 取整,大数计算推荐继续使用 sqrt 吗

回答 4 c 语言中 sqrt 取整,超大整数场景不推荐继续依赖 sqrt,因为 double 精度有限,容易产生误差,推荐二分法求解整数平方根,得到准确整数结果。

【免责申明】

本文代码属于 C 语言教学演示,仅用于学习练习,sqrt 属于浮点近似运算,不同编译器数学库实现存在细微差异,大数和负数输入没有做完整防护,实际工程开发请增加输入校验和溢出保护,本文不对所有极端数值场景的运算结果做绝对保证。

 

相关阅读

最新文章