输入两位精度的浮点数

时间:2015-01-14 15:13:20

标签: c

我正在处理一个问题,需要我输入精确到2位精度的浮点数。

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

我尝试按照以下方式阅读intfloat,其中包含两位精度:

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

有关完整参考,请参阅questionsolution

2 个答案:

答案 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;
}