C(C+;+;,Objective-C)从float到int的类型转换导致int递减

C(C+;+;,Objective-C)从float到int的类型转换导致int递减,c,casting,floating-point,int,C,Casting,Floating Point,Int,我编写了一个iPhone应用程序,遇到了一个关于float和int之间类型转换的问题。我用C重写了代码,结果总是一样的,不管它是在OS X(控制台和Xcode)、Linux(控制台)还是Windows(Visual Studio)下编译的: //根据页面数量及其在视图上的x偏移量计算页面索引 //以及视图的总宽度 #包括 int main() { int结果=0; int pagesCnt=23; 浮动补偿X=2142.0f; 浮子宽度=7038.0f; 偏移量x=偏移量x/宽度; offset

我编写了一个iPhone应用程序,遇到了一个关于float和int之间类型转换的问题。我用C重写了代码,结果总是一样的,不管它是在OS X(控制台和Xcode)、Linux(控制台)还是Windows(Visual Studio)下编译的:

//根据页面数量及其在视图上的x偏移量计算页面索引
//以及视图的总宽度
#包括
int main()
{
int结果=0;
int pagesCnt=23;
浮动补偿X=2142.0f;
浮子宽度=7038.0f;
偏移量x=偏移量x/宽度;
offsetX=(浮点)pagesCnt*offsetX;
结果=(整数)抵销x;
printf(“%f(%d)\n”,offsetX,result);
//控制台现在应该显示“7.000000(7)”
//但实际上我读到了“7.000000(6)”
返回0;
}
当然,我们在这里失去了精确性。当使用计算器进行计算时,x的结果是7.00000000000008,而不仅仅是7.000000

然而,就我对C的理解而言,这不应该是一个问题,因为C意味着在将浮点数转换为整数时截断浮点数的后点位置。在这种情况下,这就是我想要的

当使用double而不是float时,结果会和预期的一样,但是我不需要双精度,也不会有任何区别

我这里有什么不对劲吗?是否存在应避免使用(int)转换为int的情况?为什么C还是递减的结果?我应该一直用双倍的吗

非常感谢

编辑:我搞错了一些东西:当然,当使用double而不是float时,会产生不同。我的意思是,它不应该对(int)7.000000f或7.00000000000008产生影响


编辑2:多亏了你,我现在明白我的错误了。使用printf()而不定义浮点精度是错误的。(国际)ing 6.99。。。当然,到6是正确的。因此,将来遇到这样的问题时,我将使用double。

当我增加输出的精度时,我从您的程序收到的结果是
6.9999952316284179688(6)
,因此
6
似乎是正确的。

如果更改
printf(%f(%d)\n),offsetX,result)
printf(%.8f(%d)\n),偏移量,结果)您将看到问题。进行更改后,输出为:

6.99999952 (6)
6.99999952 (7)
您可以通过舍入而不是强制转换为
int
来纠正此问题。也就是说,更改
result=(int)offsetX至<代码>结果=舍入(偏移量x)。别忘了加入
。现在,输出为:

6.99999952 (6)
6.99999952 (7)

在许多情况下,编译器不能自由更改浮点运算的顺序,因为有限精度算术通常不是关联的。i、 e

(23*2142)/7038=7.00000000000000

(2142/7038)*23=6.999999999999 79


这些不是单精度结果,但它表明双精度也不能解决您的问题。

您始终可以编写
offsetX*pagesCnt/width
以尽可能长时间延迟非整数值。还请注意,
printf
的变量参数中有一个到
double
的转换。谢谢您的提示。正如我评论丹尼尔·菲舍尔的回答,我想我现在明白了。