我需要浮点数的帮助

时间:2011-09-15 01:06:51

标签: c floating-point

我非常擅长编程,参加我的第一个计算机科学课程。我正在编写程序,出于某种原因,每当我尝试计算任何操作的浮点值时,它只会产生0.00000。如果有人能帮助我,我将非常感激!

    #include <stdio.h>

    int main(void)
    {
          int numa, numb;
          int sum, halffirst, halfsecond, quotient, remainder;


          // get input
          printf("\nPlease enter two integers: ");
          scanf("%d%d", &numa, &numb);  

          // calculate dimensions
          sum = numa + numb;
          halffirst = (double)numa / 2.0;
          halfsecond = numb / 2;
          quotient = numa / numb;
          remainder = numa % numb;

          // display report
          printf("\n%20s%20s", "Description", "Data");
          printf("\n%20s%20s", "-----------", "----");
          printf("\n%20s%20d", "Sum", sum );
          printf("\n%20s%20lf", "Half (1st #)", halffirst);
          printf("\n%20s%20d", "Half (2nd #)", halfsecond);
          printf("\n%20s%20lf", "Quotient", quotient);
          printf("\n%20s%20d", "Remainder", remainder);

          // format and finish
          printf("\n\n");
          return 0;
    }

6 个答案:

答案 0 :(得分:2)

那是因为您使用的是int数据类型,它是一个整数。对整数执行的操作往往会产生整数(截断),如:

int nom = 6;
int den = 10;
float frac = nom / den;

将给出一个零值,因为算术是对整数进行的,并且只在末尾转换为浮点数(在损坏完成后)。

你可以通过施放来解决这个问题,例如:

float frac = (float)nom / (float)den;

将在除法之前的整数中生成浮点值。

但是,最好先为所有值使用浮点数。 float(单精度)或double(双精度)就是你所追求的。双精度值具有更多......良好,精确,这意味着它们可以存储更多数字和更大范围的数字。对于课堂作业,float应该没问题。

答案 1 :(得分:1)

您应该将变量指定为float或double以保存正确的值而不是使用整数。

double sum, halffirst, halfsecond, quotient, remainder;

替换行:

int sum, halffirst, halfsecond, quotient, remainder;

与上面的那个。

答案 2 :(得分:1)

根据C-99标准第7.19.6.1节第9段

  

如果转换规范无效,则行为为   undefined .251)如果任何参数不是正确的类型   相应的转换规范,行为未定义。

halffirstquotient定义为int,但在printf次调用中,您使用%lf作为double的说明符

     printf("\n%20s%20lf", "Half (1st #)", halffirst);
     printf("\n%20s%20lf", "Quotient", quotient);

根据标准,这是未定义的行为。

使用%d打印整数

     printf("\n%20s %d", "Half (1st #)", halffirst);
     printf("\n%20s %d", "Quotient", quotient);

OR,在传递

之前将整数强制转换为float
     printf("\n%20s%20lf", "Half (1st #)", (float)halffirst);
     printf("\n%20s%20lf", "Quotient", (float)quotient);

或者在传递它之前将int强制转换为浮动。

答案 3 :(得分:0)

所有变量都声明为int

尝试使用floatdouble

答案 4 :(得分:0)

有几件事:

  1. 如果要将浮点数用作变量,则必须将变量声明为float而不是int。在C和C ++中,当您对一个数字进行除法并将其赋值给int时,结果会丢弃所有小数,只留下存储在变量中的实数。
  2. 如果您正在潜水并且分母中有一个整数,则必须将整数转换为浮点数,如下所示:

    int num1 = 1, num2 = 2; float theDiv = num1/(float)num2;

  3. 如果你不这样做,它也会删除小数。

答案 5 :(得分:-1)

类型是初学程序员的噩梦。你在这里处理两种类型: int,一个整数值,和 double,一个双精度浮点数。

C和类似语言对于类型,演员和强制非常迂腐。在单个表达式中处理多个类型时,您必须非常小心。逐步打破你的行halffirst = (double)numa / 2.0;。我们来举个例子;说numa的值为5。

  • 首先,将numa投射到double。这可以。你现在有5.0作为你的除数。
  • 除以2.0。红利5.0是双倍的,除数2.0是双重的,因此结果(自然)将是双倍的2.5。也没关系。
  • 将结果存储在halffirst中。 halffirstint类型;我们无法将double的值直接存储到int变量中。因此,我们必须转换它; (int)2.5产生2,因此我们将2存储到halffirst

如果要存储除法的double结果,则需要将目标变量halffirst声明为类型double,否则最后的隐式转换将为软管您。出于同样的原因,halfsecond也是一样的。因此,在main方法顶部的声明中,请尝试以下操作:

int numa, numb;
int sum, quotient, remainder;
double halffirst, halfsecond;

有意义吗?