18

真正奇怪的事情正在发生。

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

使用这两行代码,我得到以下输出:

p1 = 0.000000

为什么带有静态数字的简单设备不起作用!我有很多工作要做来处理分裂不起作用!什么鬼,我疯了吗?

4

4 回答 4

35

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

float p1 = (6.0 / 100.0);

编辑-@Stephen Canon 明智地指出,由于 "p1" 是 a float,所以没有理由不将整个计算作为float

float p1 = (6.0f / 100.0f);

现在,由于这些东西都是常量,我想很有可能无论如何编译器都会完成这项工作。这也是事实,因为在某些现代机器(即英特尔架构)上,浮点处理器指令集非常奇怪,以至于看起来像是明显的“优化”的东西可能会或可能不会那样工作。最后,我认为使用常量进行操作可能float(在某些情况下)会给出与使用double值进行操作然后强制转换为不同的结果float,如果为真,这可能是决定一种方式或其他。

于 2010-09-13T16:48:48.053 回答
12

由于计算机认为这两个数字都是整数,因此执行整数运算并返回一个没有小数的整数,即 0 (0.06),然后转换为浮点数并存储在变量 p1 中。

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

float p1 = (6.0 / 100);

或者你可以对它进行类型转换

float p1 = ((float)6 / 100);
于 2010-09-13T16:59:37.443 回答
9

您的分配包含一个整数除法,如果您要除以的数字更大,则返回零。您可能打算这样做:

float p1 = (6.0f / 100.0f);
于 2010-09-13T16:50:40.510 回答
1

一种解决方法来划分两个 int 变量并获得浮点结果。

int x = 5;
int y = 7;

float z = x / y;  // always 0

修复

float z = 1.0 * x / y;

注意:如果您更改顺序,此解决方案将不起作用。

编辑: 根据这个答案以前的答案你可以使用这个

float z = (float) x / y;
于 2015-06-25T07:35:21.857 回答