我正在处理一个问题,需要我输入精确到2位精度的浮点数。
我知道如何使用两位精度打印浮点数,但如何在这种条件下输入浮点数?我认为这是我的程序的问题,因为没有编译错误,但它只是说错误的答案。我正在使用C语言。
我尝试按照以下方式阅读int
和float
,其中包含两位精度:
int x;
float balance,y;
scanf("%d %.2f",&x,&y);
答案 0 :(得分:3)
提出的解决方案存在问题。根据{{3}},格式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。把它作为读者的练习: - )
答案 1 :(得分:0)
这个答案输入一个浮点数,然后检查它的格式是否正确。但是,如果你正在使用资金,你应该使用int cents;
,除非你有百万美元并且不关心美分,或者正在努力获得一分钱(在这种情况下你可以在一分钱的十分之一工作)。
#include <stdio.h>
#include <string.h>
#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;
}