当前位置: 首页 > 知识库问答 >
问题:

理解double和integer

邵飞白
2023-03-14
#include <stdio.h>
void main ()
{
    int inum = 11;
    double dnum = 2.56;

    double dec_result;
    int int_result;

    dec_result = inum / 4 + (3.0 * inum) / 5;
    printf("value in dec_result is %.2f\n", dec_result);

    dec_result = (double) inum / 4 + (3 * inum) / 5;
    printf("value in dec_result is %.2f\n", dec_result);

    int_result = (int) dnum * 10 + 1;
    printf("value in int_result is %d\n", int_result);

    int_result = (int) (dnum * 10 + 1);
    printf("value in int_result is %d\n", int_result);

}

当我通过Visual Basic运行它时,我知道结果。我很难理解的是它是如何实现的。

我的工作方式:
inumdnum我认为是“值的名称”,可以与例如x或y互换使用。与int_resultdec_result相同。

第一个dec_result是8.60

dec_result = inum / 4 + (3.0 * inum) / 5;
         11 (an integer) / 4 + (3.0 * 11) / 5
         11 (an integer) / 4 + (33.0) / 5

第二个dec_result是8.75

dec_result = (double) inum / 4 + ( 3 * inum) / 5;
       = as double is a cast operator you change inum from int to double, so therefore: 

       = (double) inum / 4 + (33) / 5;
Then   = inum/4 becomes 2.75 + 33/5

为什么33/5位变成了6位?它显示为占位符指定的小数位数和数据类型double指定的小数位数。

int_result = (int) dnum * 10 + 1;
       = cast operator alters dnum a double to integer so 2.56 becomes 2

       = 2 * 10 + 1
       = 20 + 1
       = 21

应该是括号前指定的整数,而%d占位符也表示以数字形式提供值,不带小数点。

int_result = (int) (dnum * 10 + 1);

我的逻辑正确吗?

共有1个答案

史昀
2023-03-14

C编译器只有在两个操作数都是整数(整数/整数、整数+整数等)时才会做整数算术,否则会做浮点算术(双倍/整数、双倍+整数等)

第一个结果:

11 (an integer) / 4 + (33.0) / 5

第一部分(11/4)用整数算术计算,所以答案是2,第二部分(33.0/5)用浮点算术计算,所以答案是6.6,和是8.6

(double) inum / 4 + (33) / 5;

“(double)inum/4”是使用浮点算术计算的,因此答案是2.75。“33/5”是用整数算术计算的,所以答案是6,和是8.75

在以下方面:

int_result = (int) dnum * 10 + 1;

变量dnum首先转换为整数,因此使用整数算术:2*10+1==21

int_result = (int) (dnum * 10 + 1);
 类似资料:
  • 我如何解释以下内容: 打印2.29999 打印2.3

  • 问题内容: 来自http://www.angelikalanger.com/GenericsFAQ/FAQSections/TypeArguments.html#FAQ103: 具有下限的通配符看起来像“?super Type”,代表所有类型的族,它们是Type的超类型,包括Type类型。类型称为下限。 所以为什么 编译? Double不是Number的超类型,而是Number的子类… 编辑1:

  • 问题内容: 我进行了一个junit测试,使用以下命令声明了两个Double对象: 很好,然后我决定将其更改为使用原始double,除非您也提供了增量,否则该结果被弃用了。 所以我想知道在assertEquals中使用Double对象还是原始类型有什么区别?为什么不使用不带增量的对象,但不推荐使用不带增量的基元呢?Java是否在后台执行了已经考虑了默认增量值的操作? 谢谢。 问题答案: 没有断言方法

  • 描述 (Description) C库函数double modf(double x, double *integer)返回小数部分(小数点后的部分),并将整数设置为整​​数分量。 声明 (Declaration) 以下是modf()函数的声明。 double modf(double x, double *integer) 参数 (Parameters) x - 这是浮点值。 integer -

  • 描述 (Description) C库函数double fmod(double x, double y)返回x的余数除以y 。 声明 (Declaration) 以下是fmod()函数的声明。 double fmod(double x, double y) 参数 (Parameters) x - 这是具有除法分子iex的浮点值 y - 这是具有除法分母iey的浮点值 返回值 (Return Va

  • 描述 (Description) C库函数double pow(double x, double y)将x提升为y的幂,即x y 。 声明 (Declaration) 以下是pow()函数的声明。 double pow(double x, double y) 参数 (Parameters) x - 这是浮点基值。 y - 这是浮点功率值。 返回值 (Return Value) 此函数返回将x提升