如何在C语言中将double类型向下舍入为最接近的较小整数?

18
我有一个 double:
double d = 25.342;

如何将其转换为25?
如果是-12.46,我想要得到-13。

2
记录一下,你所要求的是四舍五入,而不是强制类型转换。 - Jon Seigel
4
不,这不是“四舍五入”。四舍五入是将数字转换为“最接近”的整数。 - Khaled Alshaya
11
它绝对是四舍五入。最接近舍入是一种类型的舍入。向下取整是另一种。 - Stephen Canon
1
aib: 浮点表示法很擅长表示整数(只要有足够的数字)。如果floor()出问题,我会非常惊讶。 - David Thornley
2
如果你遇到一个系统,floor() 返回一个非整数值,那么这是一个 bug ,你应该向提供该系统上的数学库的人抱怨。 - Stephen Canon
显示剩余3条评论
4个回答

33
int i = (int)floor(25.342);

我希望结果的类型是整型。 - Manuel Araoz
当 floor 的参数 > INT_MAX 或 < INT_MIN 时,问题就开始了。 - dirkgently
5
在这种情况下,您实际上无法获取该值的向下取整的整数版本,因此这并不重要。 - jprete
@KevinKostlan (int)floor(-25.342) 返回 -26,而 (int) -25.342 返回 -25。如果您知道值为正,则不需要使用 floor - yellowantphil
在这种情况下,您可以像下面这样不使用C库来完成,对吗? int i = (dbl >= 0 ? (int) dbl : ((int) dbl) -1; @amarillo - Aaron Campbell
1
@Aaron Campbell 当 dbl 是一个负整数时,((int) dbl) -1 就无法正常工作。 - chux - Reinstate Monica

16
int i = (int)floor(25.342);

注意:这将把12.99999转换为12。

参考


点赞参考链接,但你不需要将其转换为int类型,floor已经返回int类型了? - Lee
5
floor( ) 返回一个 double 值(C标准 §7.12.9.2)。 - Stephen Canon

1

其中x是你的25.342

int i = x >= 0 ? (int)(x+0.5) : (int)(x-0.5)

@Mike 我觉得他不想四舍五入数字。看看负数的例子 :) - Khaled Alshaya
我做了,他的帖子说:“(如果是-12.46,我想得到-13)”,所以我做了一点四舍五入。 - Mike
这是向下取整,或者说是floor()。 - David Thornley
四舍五入-12.46不应该得到整数值-12而不是-13吗? - semaj
不要检查是否为负数。 - Mike
1
将-12.46四舍五入到最接近的整数会得到-12,向零舍入也是如此。向下舍入将给出-13,这正是提问者想要的。 - David Thornley

0
#include <math.h>
#include <stdio.h>

int main(){

    double d = 25.342;
    double e = -12.99;

    printf("%d\n",(int)round(d)); // 25
    printf("%d\n",(int)round(e)); // -13

    return 0;
}

你可能也想看一下 stdint.h


对于许多值(例如25.9),该方法失败,因为它不能“将double舍入到最接近的较小整数”。 - chux - Reinstate Monica

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接