输入两位精度的浮点数

我正在研究一个问题,要求我输入精确到2位精度的浮点数。

我知道如何使用两位数的精度打印浮点数但是如何在这种条件下输入浮点数? 我认为这是我的程序的问题,因为没有编译错误,但它只是说错误的答案。 我正在使用C语言。

我尝试按以下方式读取一个带有两位精度的intfloat

 int x; float balance,y; scanf("%d %.2f",&x,&y); 

有关完整的参考,这里是问题和我的解决方案

提出的解决方案存在问题。 根据cplusplus.com ,格式f只接受宽度而不是精度。

如果你已经控制了scanf的返回(你应该明确地做什么 – 现在你知道为什么!)你会立即看到问题:

 int x, cr; float balance,y; cr = scanf("%d %.2f",&x,&y); if (cr != 2) { fprintf(stderr, "Read error : cr = %d\n", cr); } 

给定任何输入,您将获得:

 Read error : cr = 1 

可能的实施,几乎没有变化:

 cr = scanf("%d %f",&x,&y); if (cr != 2) { fprintf(stderr, "Read error : cr = %d\n", cr); } // should round to only two digits - within floating point accuracy y = (((double)((int)(y * 100 + 0.5))) / 100.); 

如果你有一个math.h包含round (不是MSVC :-()的系统,最后一行写得更好(感谢chux提出它):

 y = round(y * 100)/100 

因为上面的公式将对负y和y > INT_MAX / 100失败

如果你真的需要两个十进制数字的精确精度,正确的方法是将所有计算作为整数 整数 ,取数字乘以100.我把它作为读者的练习:-)

这个答案输入一个浮点数,然后检查它是否格式正确。 但如果你正在使用钱,你应该使用int cents; 除非你有百万美元并且不关心美分,或者正在努力获得一分钱(在这种情况下你可以在一分钱的十分之一工作)。

 #include  #include  #define BUFLEN 20 int main() { float money; char buff[BUFLEN+1], bank[BUFLEN+1], *eptr; printf ("Input the money: "); if (fgets(buff, BUFLEN, stdin) == NULL) { printf("Failed input\n"); return 1; } if ((eptr = strchr (buff, '\n')) != NULL) // newline? *eptr = 0; // terminate if (sscanf(buff, "%f", &money) != 1) { // get the money printf("Failed input\n"); return 1; } sprintf(bank, "%0.2f", money); // check format of entry if (strcmp(bank, buff)) { printf("2 digit precision please: Euros.cents\n"); return 1; } printf("You paid %s\n", bank); return 0; }