C 在这段代码中,为什么我只在输入值4.2时得到了错误的输出,而它在其他值上运行良好?

C 在这段代码中,为什么我只在输入值4.2时得到了错误的输出,而它在其他值上运行良好?,c,C,下面的代码将美元(浮点值)转换为美分(整数值)。这里1美元=100美分。除了一个值(即4.2)外,该代码工作正常。它将4.2的输出作为419而不是420作为输入。臭虫在哪里 #include <stdio.h> int main(void) { float change; do { printf("O hai! Enter amount in dollars to convert in cents.\n"); scan

下面的代码将美元(浮点值)转换为美分(整数值)。这里1美元=100美分。除了一个值(即4.2)外,该代码工作正常。它将4.2的输出作为419而不是420作为输入。臭虫在哪里

#include <stdio.h>
int main(void)
{   
    float change;

    do
    {
        printf("O hai! Enter amount in dollars to convert in cents.\n");

        scanf("%f",&change);   //accepts input in dollars

    } while(change < 0.00);

    int i = change * 100;    //converts dollars into cents

    printf("The equivalent cents are %d\n",i);
}
#包括
内部主(空)
{   
浮动变化;
做
{
printf(“O hai!输入以美元表示的金额,以美分表示。\n”);
scanf(“%f”,&change);//接受美元输入
}而(变化<0.00);
int i=change*100;//将美元转换为美分
printf(“等值分为%d\n”,i);
}

许多浮点值在基数2中没有精确的表示形式

您可以尝试添加一个非常小的值来稍微推送该值:

int i = (change + 0.0001) * 100;    //converts dollars into cents

您之所以有这种行为,是因为
float
的表示方式

在中,
4.2
实际上存储为
4.199999809265613671875
,因此当您将其乘以
100
并将其转换回
int
,您将得到
419
(即结果的整数部分)

解决办法是使用

int i = (int) roundf(change * 100);

使用
#include

可以看到,当您将值存储在
浮点数中时,实际存储的数字并不总是您期望的数字。这是由于浮动是如何用二进制表示的(您可以在上了解更多)

现在,如中所示,当您尝试在change中存储
4.2
时,实际上是存储
4.19…
。将它乘以100,存储在
int
中,得到419

float
更改为
double
将提供更好的(双)精度,在您的情况下,它将产生预期的结果

double change; # float changed to double
do
{
    printf("O hai! Enter amount in dollars to convert in cents.\n");

    scanf("%lf",&change);   //accepts input in dollars # "%f" changed to "%lf"

} while(change < 0.00);

int i = change * 100;    //converts dollars into cents

printf("The equivalent cents are %d\n",i);

input: 4.2
output: 420
double change;#浮动变为双浮动
做
{
printf(“O hai!输入以美元表示的金额,以美分表示。\n”);
scanf(“%lf”,&change);//接受美元输入#“%f”更改为“%lf”
}而(变化<0.00);
int i=变化*100//把美元换成美分
printf(“等值分为%d\n”,i);
投入:4.2
产出:420
在我的机器上


请注意,使用
double
不是故障保护。它也可能给出误导性的结果,但它的表现应该比
float

好。在这种情况下,您知道使用金钱工作的小数是2,我建议使用3个小数的float表示,然后结果必须四舍五入到2个小数。重要的是要小心,因为与钱打交道是非常微妙的。
希望这有帮助。

是时候阅读了。最好使用
int
类型进行“更改”在处理浮点值时,总是首选<代码>双<代码>。是否检查了所有可能的浮点值并确保这是唯一不可用的值?可能考虑的重复代码<代码> long int LrINTF(浮点X)在一个调用中循环并转换为整数类型。为了可读性,我仍然更喜欢显式类型转换(尽管比from
double
)更轻。
double
vs
float
的额外精度通常没有帮助。将
x.9999999
x.9999999999999999
转换为
int
同样有问题。正如我所提到的,double是更好的选择,而不是总体上的好选择。对于这篇文章,is起了作用:)对于4.2的值,使用
double
可能会起作用,但与使用
float
相比,它不会降低出现问题的几率。大约一半的“十进制”值,如4.2、1.23、123.456。。。使用
float
double
时出现此问题。
double change; # float changed to double
do
{
    printf("O hai! Enter amount in dollars to convert in cents.\n");

    scanf("%lf",&change);   //accepts input in dollars # "%f" changed to "%lf"

} while(change < 0.00);

int i = change * 100;    //converts dollars into cents

printf("The equivalent cents are %d\n",i);

input: 4.2
output: 420