为什么在c语言中简单的数学计算会给予错误的答案?

u91tlkcl  于 2023-03-01  发布在  其他
关注(0)|答案(1)|浏览(155)

这个问题是由打字错误或无法再重现的问题引起的。虽然类似的问题在这里可能是on-topic,但这个问题的解决方式不太可能帮助未来的读者。
昨天关门了。
Improve this question

    • 问题**

一些计算给了我错误的答案。有人能告诉我正确的数学运算方法吗?(如对数字使用什么数据类型等)

// setup code
#include <stdio.h>

int num1 = 24;
int num2 = 7;
float result;

// main code
int main() {
    printf("this is x:%d\n", num1);
    printf("this is y:%d\n", num2);

    result = num1 / num2; // this outputs 0 
    printf("this is int of x/y: %d\n", result);
    
    result = (float) num1 / num2; // this outputs -536870912
    printf("this is float of x/y: %d", result);

    return 0;
}
// end

第一个输出是0。我原以为是3
第二个输出是-536870912。我原以为是3.42
我试过使用其他数据类型和类型转换,但我不记得它们是什么,这是我想使用的代码无论如何。

92dk7w1h

92dk7w1h1#

你的代码有几个不同的问题。这些问题相互干扰,产生了你所看到的令人惊讶的结果。
直接导致您所看到的怪异行为的问题:

  • result被声明为float,因此在这两种情况下,result = num1 / num2都将被计算为浮点型,而不是整型。
  • 当使用printf打印浮点数时,必须使用"%f",而不是"%d""%d"用于整型。

int和float是用不同的编码存储在内部的,所以如果一个变量是float,你告诉printf它是一个int,反之亦然,printf不可避免地会显示一堆垃圾。
其他问题:

  • 变量应该在main内部声明,而不是在main外部声明。
  • 您的第二个printf缺少一个\n,这意味着它可能根本没有打印出来,如果在控制台中打印出来,它会使显示有点混乱。

最后,关于铸造和操作顺序的一条警告:

  • 为了进行浮点除法,正确的操作是((float) num1) / num2,而不是(float) (num1 / num2),这是因为(num1 / num2)是整数除法,结果是3;一旦你有了3,就太晚了,如果你强制转换成(float),你会得到3.0,而不是3.42
  • 当你写(float) num1 / num2时,你知道这是被解释为((float) num1) / num2还是(float) (num1 / num2)吗?如果你知道,那很好,但是如果你不知道,那就不要写。

正确代码:

#include <stdio.h>

int main() {
    int num1 = 24;
    int num2 = 7;
    int integer_quotient;
    float float_quotient;

    printf("this is x:%d\n", num1);
    printf("this is y:%d\n", num2);

    integer_quotient = num1 / num2;
    printf("this is int of x/y: %d\n", integer_quotient);
    
    float_quotient = ((float) num1) / num2;
    printf("this is float of x/y: %f\n", float_quotient);

    return 0;
}

相关问题