2010-09-13 143 views
18

发生了一些非常奇怪的事情。objective-c除以总是返回0

float p1 = (6/100); 
NSLog(@"p1 = %f", p1); 

随着代码,我得到以下输出这两行:

P1 = 0.000000

为什么不工作与静态数字的简单devide!我有很多工作要做,以处理鸿沟不工作!他怎么了,我疯了吗?

回答

35

这些常量是整数,所以数学是用整数数学完成的。尝试

float p1 = (6.0/100.0); 

编辑 — @Stephen佳能明智地指出,由于“P1”是float,我们没有理由不这样做的整个计算为float

float p1 = (6.0f/100.0f); 

现在,因为这些事情都是常量,我想可能有一个很好的机会,无论如何编译工作都会完成。同样,由于在一些现代机器上(即Intel架构),浮点处理器指令集足够怪异,看起来像是一个明显的“优化”的东西可能会或可能不会这样。最后我想可能是这样的情况,即用float常量进行操作可能会(在某些情况下)给出不同的结果,即使用double值进行操作,然后将结果转换为float,如果属实,则该操作可能是决定一种方式或另一种方式。

+0

感谢,这是它。 – 2010-09-13 16:57:41

+4

如果回答你的问题,你实际上应该接受答案。 – imaginaryboy 2010-09-13 18:17:08

+1

但是使用单精度字面量来避免不必要的从double到single的转换:'float p1 = 6.0f/100.0f' – 2010-09-13 19:41:53

9

您的分配包含整数除法,如果您除以的数字更大,则返回零。你大概的意思做:

float p1 = (6.0f/100.0f); 
12

由于这两个数字被认为是由计算机整数,进行整数运算和整数没有小数是0(0.06)返回,然后转换为浮动并存储在变量p1中。

至少一个数字(或两者)必须浮动才能进行浮点数学运算,当您将一个小数附加到数字上时,您会告诉计算机该常数是浮点数。

float p1 = (6.0/100); 

或者你可以围绕它强制转换

float p1 = ((float)6/100); 
1

一项工作分为两个int变量,并得到float结果。

int x = 5; 
int y = 7; 

float z = x/y; // always 0 

的修复

float z = 1.0 * x/y; 

注:如果更改为了这个解决方案将无法工作。

编辑: 根据这个答案previous answer您可以使用此

float z = (float) x/y;