【问题标题】:Why double variable is not showing remainder after division in c? [duplicate]为什么双变量在c中除法后不显示余数? [复制]
【发布时间】:2018-01-08 15:42:53
【问题描述】:

我一定犯了一些严重的错误,但我正在计算 C 中 2880 * 12 / 512 的结果,即使我将结果保存在 double 变量中,它只是不保存剩下的。根据谷歌和任何其他计算器 2880 * 12 / 512 = 67.5 但是根据下面的程序它是 67.00。这是代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdint.h>
#include <math.h>

int main() {
    double result;
    result = 2880 * 12 / 512;
    printf("result = %f\n", result);
    return 0;
}

我正在编译名为 test.c 的文件,其中包含以下代码:gcc test.c -o test -lm

我做错了什么?

【问题讨论】:

  • 你最喜欢的教程没有介绍这个吗?
  • 2880 * 12 / 512 都是整数。你可能想要2880.0 * 12.0 / 512.0
  • OT:您显示的代码未使用来自math.h 和/或libm 的任何内容。不需要包含/链接。
  • @alk — 和 &lt;stdint.h&gt;&lt;string.h&gt;&lt;stdlib.h&gt; 也是多余的。

标签: c division


【解决方案1】:

类型转换您的整数文字值。像这样。

result = (double)2880 * 12 / 512;

C11 标准:

6.5.5 乘法运算符

6 整数相除时,/操作符的结果是任意的代数商 小数部分被丢弃。88) 如果商 a/b 是可表示的,则表达式 (a/b)*b + a%b 应等于 a。

【讨论】:

  • 高级角落问题:(double) some_integer 强制转换为 double。如果 some_integer 是一个较大的 60 位数字,则该转换可能会导致舍入。通过使用 1.0*some_integer 而不是强制转换来推动 double 数学,当 FLT_EVAL_METHOD==2 时,可以使用 long double 数学进行转换并形成更准确的答案。
【解决方案2】:

2880 * 12 / 512 是一个整数表达式,计算结果为整数。事实上,它被分配给一个双变量,但随后精度丢失。您需要强制转换为双精度,以便计算结果为双精度。

result = (double)2880 * 12 / 512;

或者附加一个小数点来告诉编译器它是一个浮点数:

result = 2880. * 12 / 512;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-16
    • 2013-05-20
    • 1970-01-01
    • 1970-01-01
    • 2017-07-10
    • 2012-04-29
    • 1970-01-01
    相关资源
    最近更新 更多