如何打印分数

时间:2016-06-30 03:19:28

标签: c int double precision

我正在尝试使用struct编写一个程序来找到两点的中点。但是,当我尝试打印float时,输出总是为零,并且在print int时始终是最接近的整数(当需要分数时)。那么我怎么能正确地说它可以打印出一小部分。 (例如,当输出可以是诸如1.5的数字时)

#include <stdio.h>
#include <stdlib.h>

struct point{
       int x;
       int y;
};

struct rect{
       struct point pt1;
       struct point pt2;
};

struct point makepoint(int x, int y){
       struct point temp;

       temp.x = x;
       temp.y = y;
       return temp;
}

int main()
{

  struct rect screen;
  struct point middle;
  struct point makepoint(int, int);

  int XMAX, YMAX;
  XMAX = YMAX = 0;

  screen.pt1 = makepoint(0,0);
  printf("Enter the x axis: ");
  scanf("%d",&XMAX);
  printf("Enter the y axis: ");
  scanf("%d",&YMAX);
  screen.pt2 = makepoint(XMAX,YMAX);
  middle = makepoint((screen.pt1.x + screen.pt2.x)/2,(screen.pt1.y +   screen.pt2.y)/2); 

  printf("x = %f, ",middle.x);
  printf("y = %f\n",middle.y);



  return 0;
}

4 个答案:

答案 0 :(得分:3)

你在任何地方都绝对没有“非整数”数学。

(screen.pt1.x + screen.pt2.x)/2是整数。你需要强迫某些东西成为浮动。喜欢:(screen.pt1.x + screen.pt2.x)/2.0

正如AAT在评论中指出的那样,您似乎期望将浮点数存储为整数,因此您可能需要更改point来存储浮点数而不是整数。

答案 1 :(得分:0)

首先,您的Point结构存储xy作为int,

对于这一行middle = makepoint((screen.pt1.x + screen.pt2.x)/2,(screen.pt1.y + screen.pt2.y)/2);

无论如何,你有两个整数坐标。

所以你必须改变两件事:

  1. 在结构float
  2. 中存储int而不是Point
  3. 转换/隐式在分割时将数字转换为float,如(screen.pt1.x + screen.pt2.x)/2.0所提到的其他答案

答案 2 :(得分:0)

这里有两个问题。

首先,middle.xmiddle.y被声明为整数:

struct point{
       int x;
       int y;
};

您需要将它们声明为浮点数。

其次,middle.xmiddle.y被设置为整数值。

C运算符/有点奇怪:当两个参数都是整数时,结果是一个整数,因此在您的情况下,进行如下计算:(screen.pt1.x + screen.pt2.x)/2(screen.pt1.y + screen.pt2.y)/2将是给你整数(向下舍入)。解决方案是通过给出精度来使这些参数中的至少一个成为浮点数,例如将其中一个转换为浮点数:(float)(screen.pt1.x + screen.pt2.x)/2,或者使用2.0(浮点数)而不是{{1 }}

一个有趣的事实:你实际上可以告诉C你想要多少个十进制值,所以在你的情况下,你可以创建你的printf语句:

2

要说您希望输出精确到2位小数。您可以找到规则列表here

答案 3 :(得分:0)

这里的问题是你把中间点保持为一个整数,当它听起来你想要它是一个浮点数。当你对整数进行数学运算时,你将得到一个整数。让我们执行你的程序一秒......

我们有两个点,一个在(0,0),一个在我们设置的任何地方。假设我们使用(1,1)

好吧,所以在现实世界中,我们希望我们的输出为0.5,0.5。但是,当我们进行整数数学运算时,我们向下舍入到最近的数学。所以...

整数世界中

(1 - 0)/ 2 = 0 ...

我认为你要改变的部分是:

struct point{
       int x;
       int y;
};

进入这个:

struct point{
       float x;
       float y;
};

和这个:

struct point makepoint(int x, int y){
       struct point temp;

       temp.x = x;
       temp.y = y;
       return temp;
}

进入这个:

struct point makepoint(float x, float y){
       struct point temp;

       temp.x = x;
       temp.y = y;
       return temp;
}

当你进入它时,你应该使用浮点数,这样你就可以在整数之间输入点。

希望这有帮助!