【问题标题】:Why is float multiplication showing 0为什么浮点乘法显示为0
【发布时间】:2015-01-13 04:20:55
【问题描述】:
float yLimit = [[UIScreen mainScreen] bounds].size.height;
yLimit = yLimit * (2/3);
NSLog(@"ylimit: %f", yLimit);

nslog 产生 0.0。

嗯?

【问题讨论】:

  • 尝试将 f 或 F 放在 2 和 3 之后
  • 或者把3改成3.0。 yLimit *= 2/3.0:
  • 顺便说一句 - 使用 CGFloat,而不是 float
  • @rmaddy 这么说的原因是因为 CGFloat 在 32 位和 64 位系统上分别被条件化为浮点数或双精度数,并且 UIKit 和 AppKit 使用 CGFloat 测量坐标。实际上,您可能在某处忽略了一些警告,因为 Xcode 中的 Clang 会唠叨您进行隐式转换,通常会丢失精度。

标签: objective-c floating-point uiscreen


【解决方案1】:

换句话说,2 和 3 是隐式整数类型。当 ⅔ 除法发生时,您会得到整数除法。零。没有余数。没有四舍五入。

然后你乘以一个浮点数就是那个结果。

这里的教训是你应该明确地输入你的文字。 C 有文字的后缀来帮助你。

它实际上是为人类阅读代码而为编译器设计的。

【讨论】:

    【解决方案2】:

    更改您的代码

    yLimit = yLimit *(2/3);

    yLimit = yLimit *2/3;

    2/3 发生除法时,您会得到0。 (零)然后0 乘以yLimit 得到0

    2/3 等同于Int/Int,这会导致Int 而不是提问者所期望的DoubleFloat

    好吧,yLimit * (2/3) 结果为 yLimit * 0,为 2/3 = 0.6666666667,但由于隐式整数类型,它四舍五入为 0

    【讨论】:

    • 我正要指出这没有什么区别,但它确实有。您应该解释为什么会这样。
    • @FahimParkar 同样在这里什么?你会和我说同样的话,还是你想知道它为什么有效?我知道为什么,我只是想给发帖者一个解释的机会。
    • @rmaddy : 与此相同 我正要指出这没有什么区别,但实际上确实如此。 我正要投反对票,但它有效.. 和它的工作 bcz 它将表现得像 (yLimit*2)/3
    • 之所以有效是因为yLimit * 2 / 3(yLimit * 2) / 3 相同。 yLimit * 2floatint 组成。 int 提升为 float,相乘的结果是 float 值。然后用floatint (3) 完成除法。一样。 int 提升为 floatfloat / float 的结果是 float。但是原始代码首先执行2 / 3。这是int / int,它给出了int 结果(0)。然后floatyLimit)乘以0(在提升为float之后)。任何时候0 都是0
    • 删除括号是可行的,因为 C 中的运算符优先级。在此语句中使用 * 乘法和 / 除法,C 将像您阅读它一样从左到右计算。
    猜你喜欢
    • 2018-01-04
    • 2012-05-18
    • 2017-04-18
    • 1970-01-01
    • 1970-01-01
    • 2011-11-01
    • 1970-01-01
    • 2011-03-03
    • 2010-10-05
    相关资源
    最近更新 更多