C 从浮点转换为整数时,浮点结果如何舍入为整数?

C 从浮点转换为整数时,浮点结果如何舍入为整数?,c,type-conversion,C,Type Conversion,从浮点转换为整数时,浮点结果如何舍入为整数 有时我在整数变量之间进行一些复杂的算术运算(包括乘法、除法等),然后将结果再次转换为int 例如: result = (int) ((int1 + int2) * int3 / int4); int1 = 31; int2 = -1366; int3 = 50; int4 = 1000; 有时会将结果四舍五入到最接近的整数,有时则会将结果四舍五入到较低的整数,即使浮点结果更接近较高的整数,有时会将结果向上或向下四舍五入2个整数(即,如果结果为-15

从浮点转换为整数时,浮点结果如何舍入为整数

有时我在整数变量之间进行一些复杂的算术运算(包括乘法、除法等),然后将结果再次转换为int

例如:

result = (int) ((int1 + int2) * int3 / int4);
int1 = 31;
int2 = -1366;
int3 = 50;
int4 = 1000;
有时会将结果四舍五入到最接近的整数,有时则会将结果四舍五入到较低的整数,即使浮点结果更接近较高的整数,有时会将结果向上或向下四舍五入2个整数(即,如果结果为-150.69,则结果可能为-149)

从float到int的转换有一些规律,还是取决于具体情况

提前谢谢


例如:

result = (int) ((int1 + int2) * int3 / int4);
int1 = 31;
int2 = -1366;
int3 = 50;
int4 = 1000;

结果应该是-66.75,但返回的结果是-65。

在代码中,除非
int1
int4
实际上是浮点,否则您没有任何浮点类型,因此您的问题与代码无关


至于问题本身,浮点到整数的转换总是通过截断(丢弃小数部分)进行的。对于舍入,标准库具有许多功能,如
floor
ceil
round
,这些功能可以执行不同类型的舍入。

任何C语言书都会解释“转换定律”。 有很多“谷歌”材料可供选择

看看这个

请给出一个示例(输入集
int1
int4
),展示您所描述的行为。所有
intn
变量都是int吗?如果是这样,那么这里就没有浮点数了,我想你的问题是“整数除法是如何执行的”。@interjay是的,所有变量都是整数。你确定结果是-65而不是-66吗?如果是,实际的类型是什么(无符号int、短int、just int等)以及您使用的编译器是什么?那么如果我的4个变量都是整数,那么每个操作都会被截断?这就是-150.69被“舍入”为-149的原因吗?@aliant:是的,每个整数操作数的操作都是用整数算术单独完成的。每个中间结果都会被截断(或溢出)以匹配所使用的类型。更重要的是,C有一些使用整数类型的特殊规则。通常,如果使用
int
对象,则会有
int
算术运算,溢出
int
的结果将导致问题。如果使用一个
unsigned int
对象,大多数二进制运算符中的另一个
int
操作数将转换为
unsigned int
。如果将
long
int
一起使用,则
int
将转换为
long
,等等。请注意,这仍然无法解释为什么-66.75“四舍五入”为-65(而不是预期的截断为-66)。在您的示例中(在注释中),-150.69将被截断为-150,而不是“四舍五入”为-149。