【问题标题】:objective-c divide always returns 0Objective-c 除法总是返回 0
【发布时间】:2010-09-13 16:46:16
【问题描述】:

发生了一些非常奇怪的事情。

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

通过这两行代码,我得到以下输出:

p1 = 0.000000

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

【问题讨论】:

    标签: objective-c operations divide


    【解决方案1】:

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

    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
    【解决方案2】:

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

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

    float p1 = (6.0 / 100);
    

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

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

    【讨论】:

      【解决方案3】:

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

      float p1 = (6.0f / 100.0f);
      

      【讨论】:

        【解决方案4】:

        一种解决方法,将两个 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;
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-12-14
          • 1970-01-01
          • 2013-04-25
          • 1970-01-01
          • 1970-01-01
          • 2011-04-01
          相关资源
          最近更新 更多