C 'float' 生成随机答案

标签 c floating-point division

我的输出应该是:

ch = *
f = 200
ch = /
f = 0.50

但由于某种原因,每次运行程序时“/”大小写都是一个随机数。 1639747584,接下来我得到206200832,这是为什么?这也是程序中我使用“float”而不是“int”的唯一部分。

我的代码:

#include <stdio.h>
#include <float.h>

void main() {
    char ch; 
    int f;
    int a = 10, b = 20;

    ch = '*';
    printf("ch = %c\n", ch);
    switch (ch) {
        case '*': f = a * b; printf("f = %d\n", f);
        break;
        case '/': f = a / b; printf("f = %d\n", f);
        default: printf("invalid operator\n");
    }
    ch = '/';
    printf("ch = %c\n", ch);
    (float) f;
    switch (ch) {
        case '*': f = a * b; printf("f = %d\n", f);
        case '/': f = a / b; printf("f = %d\n", f);
        break;
        default: printf("invalid operator\n");
    }
}

好吧,我用一个新变量替换了“(float)f”行,更改了打印命令,并将 (a/b) 转换为“float”,但现在我只得到 0.00 作为结果。还有什么问题吗?

更新的代码:

    ch = '/';
    printf("ch = %c\n", ch);
    float g;
    switch (ch) {
        case '*': f = a * b; printf("f = %d\n", f);
        case '/': g = (float)(a / b); printf("f = %.2f\n", g);
        break;
        default: printf("invalid operator\n");
    }

最佳答案

int a = 10, b = 20;
float g = (float)(a / b);  // problem code

执行a/b的整数除法。结果是一个int。将该商转换为 (float) 不会恢复作为整数除法的一部分而丢弃的分数。在除法之前确保参数是浮点型。

float g = (float) a / b;
// or better
// in general, better to avoid casts to accomplish coding goals.
float g = 1.0 * a / b;
// or 
float g = a;
g /= b;
<小时/>
(float) f;

这行代码没有任何作用。它是将 int 变量 f 转换为 float 值。该转换的结果将被丢弃,并且该代码行可能会被优化,导致不会发出与其相关的可执行代码。

<小时/>

要将不同类型的数据保存在单个对象中,请使用 union 并跟踪上次用于将数据保存到其中的字段。

struct universal {
  char kind; 
  union {
    int i;
    float f;
  } u;
} y;

switch (ch) {
  case '*': 
    y.kind = 'i';
    y.u.i = a * b;
    break;
  case '/': 
    y.kind = 'f';
    y.u.f = (float) a / b;
    break;
  default:
    y.kind = 0;
}

switch (y.kind) {
  case 'f' : printf("y = %f\n", y.u.f); break; //or "%.2f" for only 2 places to right of .
  case 'i' : printf("y = %d\n", y.u.d); break;
  default  : printf("y = ?\n"
}

关于C 'float' 生成随机答案,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42183393/

相关文章:

python - ldexp 和 frexp 在 python 中如何工作?

在 c 中的 main() 中调用 main()

c - gcc:为什么两个不同的变量在调用后具有相同的值?

c - 浮点运算结果如何舍入?

javascript - Python 与 Javascript 浮点运算给出了截然不同的答案。我究竟做错了什么?

c - 编写一个程序,提示用户输入球体的半径并打印其体积

php - MySQL如何在使用除法时保留精度?

java - 优化代码以获取给定范围内可被整数整除的整数个数

c - 如何在双向链表中实现 "prev"指针逻辑

c - MIPS 到 C 的翻译