【发布时间】:2010-09-13 16:46:16
【问题描述】:
发生了一些非常奇怪的事情。
float p1 = (6 / 100);
NSLog(@"p1 = %f", p1);
通过这两行代码,我得到以下输出:
p1 = 0.000000
为什么带有静态数字的简单设备不起作用!我有很多工作要做来处理分裂不起作用!什么鬼,我疯了吗?
【问题讨论】:
标签: objective-c operations divide
发生了一些非常奇怪的事情。
float p1 = (6 / 100);
NSLog(@"p1 = %f", p1);
通过这两行代码,我得到以下输出:
p1 = 0.000000
为什么带有静态数字的简单设备不起作用!我有很多工作要做来处理分裂不起作用!什么鬼,我疯了吗?
【问题讨论】:
标签: objective-c operations divide
那些常量是整数,所以数学是用整数数学完成的。试试
float p1 = (6.0 / 100.0);
edit — @Stephen Canon 明智地指出,由于“p1”是 float,所以没有理由不像 float 那样进行整个计算:
float p1 = (6.0f / 100.0f);
现在,由于这些东西都是常量,我想很有可能无论如何编译器都会完成这项工作。这也是事实,因为在某些现代机器(即英特尔架构)上,浮点处理器指令集非常奇怪,以至于看起来像是明显的“优化”的东西可能会或可能不会那样工作。最后,我认为 可能 使用 float 常量进行操作可能(在某些情况下)给出与使用 double 值进行操作然后转换为 float 不同的结果,如果为真,这可能是决定一种或另一种方式的最佳论据。
【讨论】:
float p1 = 6.0f / 100.0f
由于计算机认为这两个数字都是整数,因此执行整数运算并返回一个不带小数的整数,即 0 (0.06),然后转换为浮点数并存储在变量 p1 中。
至少一个数字(或两者)必须是浮点数才能进行浮点数学运算,当您将小数附加到一个数字后,您会告诉计算机该常数是一个浮点数。
float p1 = (6.0 / 100);
或者你可以对它进行类型转换
float p1 = ((float)6 / 100);
【讨论】:
您的分配包含一个整数除法,如果您要除的数字更大,则返回零。你可能打算这样做:
float p1 = (6.0f / 100.0f);
【讨论】:
一种解决方法,将两个 int 变量相除并获得浮点结果。
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;
【讨论】: