【问题标题】:c++ static_cast returns zero [duplicate]c ++ static_cast返回零[重复]
【发布时间】:2016-06-02 00:17:15
【问题描述】:

这是我的问题:

#include <stdio.h>
#include <math.h>

int main()
{

    int n = static_cast<int>(50 * (60 / 99));

    printf("Floor: %d\n", n);

    return 0;
}

为什么函数应该打印 30 却打印 0?

因为计算结果是:30.30303030

【问题讨论】:

  • 它更像是 0.6 .. 怎么才能让孔计算返回 30?
  • 60/99 被评估为整数数学,因此结果为 0。将任一值更改为浮点数:`60.0f / 99.f` 将是完成这项工作的一种方法。跨度>
  • 一种存档方法是使用另一种语言,例如 JavaScript,或者您开发的支持 static_cast、始终返回浮点值的除法以及您想要的所有其他功能的语言。
  • 因缺乏研究努力而被否决。这个问题的答案在 SO 和其他资源中都很容易找到。
  • 太糟糕了,我无法向您显示我的搜索历史...我确实搜索了大约 2 个小时...

标签: c++ c++11 visual-c++


【解决方案1】:

计算结果不是30.30303030而是0因为

  1. 60 / 99 已计算。结果被截断为零,因为这是整数除法,结果为 0
  2. 50 * 0 已计算。结果为 0。

您应该使用double 进行计算。

#include <stdio.h>
#include <math.h>

int main()
{

    int n = static_cast<int>(50.0 * (60.0 / 99.0));

    printf("Floor: %d\n", n);

    return 0;
}

使用50 * (60.0 / 99)50 * (60 / 99.0) 代替50.0 * (60.0 / 99.0) 也可以,因为其他操作数将转换为double 以匹配类型,但使用50.0 * (60 / 99) 并不好,因为60 / 99 为0。

【讨论】:

  • 非常感谢 :D 我认为 double 不会有帮助 :D 问题解决了。现在我可以轻松地对系统的其余部分进行编码。因为 50 是一个变量 PlayerLevel。
猜你喜欢
  • 2016-07-06
  • 2015-10-01
  • 1970-01-01
  • 2021-12-12
  • 1970-01-01
  • 2016-05-30
  • 2021-11-11
  • 1970-01-01
  • 2016-12-30
相关资源
最近更新 更多