为什么此代码忽略数组中的0.10和0.01值。 [英] Why this code ignore 0.10 and 0.01 value in the array.

查看:54
本文介绍了为什么此代码忽略数组中的0.10和0.01值。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的自助结账工作的核心,我想知道为什么它不能正常工作。它忽略了0.10和0.01的值,我不知道为什么。请帮我。





 int main()
{
float howMuch;
浮动付款;
浮动货币[13] = {100,50,20,10,5,2,1,0.50,0.20,0.10,0.05,0.02,0.01};
scanf(%f,& howMuch);
while(howMuch> 0)
{
scanf(%f,& payment);
howMuch - =付款;
}
howMuch = -1 * howMuch;
for(int i = 0; i< 13; i ++)
{
while(money [i]< = howMuch)
{
howMuch - =钱[I];
printf(%。2f,money [i]);
}
}
printf(\ n);
返回0;
}





我的尝试:



没什么,我认为它应该可行。

解决方案

这是一个舍入问题(参见每个计算机科学家应该知道关于浮点运算的知识 [ ^ ])。尝试运行

  #include   <   stdio.h  >  
int main()
{
float howMuch;
浮动付款;
float money [ 13 ] = { 100 50 20 10 5 2 1 0 50 0 。< span class =code-digit> 20 , 0 10 0 05 0 02 0 01 };
scanf( %f,& howMuch);
while (howMuch> 0
{
scanf( %f,& payment);
howMuch - =付款;
}
howMuch = - 1 * howMuch;

printf( howMuch =%f\ n,howMuch) ;
for int i = 0 ; i< 13 ; i ++)
{
while (money [i]< = howMuch)
{
howMuch - = money [i];
printf( money%.2f(howMuch%f)\ n,钱[i],怎么样);
}
}
printf( \ n) ;
return 0 ;
}



howMuch = .9 pay = 100 它输出:

 howMuch = 99.099998 
money 50.00(howMuch 49.099998)
money 20.00(howMuch 29.099998)
money 20.00(howMuch 9.099998)
钱5.00(howMuch 4.099998)
钱2.00(howMuch 2.099998)
钱2.00(howMuch 0.099998)
钱0.05(howMuch 0.049998)
钱0.02(howMuch 0.029998)
money 0.02(howMuch 0.009998)



我建议您使用 int s (粒度,例如 150 意味着 1.50 )而不是 float s。


Quote:

为什么这段代码会忽略数组中的0.10和0.01值。



因为你使用浮点数!

浮点数不是确切的值。

如果你说你以美分工作,你可以切换到整数。

某些语言有货币 datatyp e with是缩放整数。


例如,如果howMuch为0.90且pay为100,则返回50 20 20 5 2 2 0.05 0.02 0.02 ... not 50 20 20 5 2 2 0.10

This is the core from my self-checkout assignment and I am wondering why it is not working properly. It is ignoring 0.10 and 0.01 value, and I do not know why. Please help me.


int main()
{
float howMuch;
float payment;
float money[13] = {100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01};
scanf("%f", &howMuch);
while(howMuch > 0 )
{
    scanf("%f", &payment);
    howMuch -= payment;
}
howMuch = -1*howMuch;
for(int i = 0; i < 13; i++)
{
    while(money[i] <= howMuch)
    {
        howMuch -= money[i];
        printf("%.2f ", money[i]);
    }
}
printf("\n");
return 0;
}



What I have tried:

Nothing, I just think it should work.

解决方案

It is a rounding problem (see What Every Computer Scientist Should Know About Floating-Point Arithmetic[^]). Try to run

#include <stdio.h>
int main()
{
float howMuch;
float payment;
float money[13] = {100, 50, 20, 10, 5, 2, 1, 0.50, 0.20, 0.10, 0.05, 0.02, 0.01};
scanf("%f", &howMuch);
while(howMuch > 0 )
{
    scanf("%f", &payment);
    howMuch -= payment;
}
howMuch = -1*howMuch;

printf("howMuch = %f\n", howMuch);
for(int i = 0; i < 13; i++)
{
    while(money[i] <= howMuch)
    {
        howMuch -= money[i];
        printf("money %.2f (howMuch %f)\n", money[i], howMuch);
    }
}
printf("\n");
return 0;
}


With howMuch = .9 and payment = 100 It outputs:

howMuch = 99.099998
money 50.00 (howMuch 49.099998)
money 20.00 (howMuch 29.099998)
money 20.00 (howMuch 9.099998)
money 5.00 (howMuch 4.099998)
money 2.00 (howMuch 2.099998)
money 2.00 (howMuch 0.099998)
money 0.05 (howMuch 0.049998)
money 0.02 (howMuch 0.029998)
money 0.02 (howMuch 0.009998)


I suggest you to use ints (with cent granularity, e.g. 150 would mean 1.50) instead of floats.


Quote:

Why this code ignore 0.10 and 0.01 value in the array.


Because you are using floats!
Floats are not exact values.
If you say that you work in cents, you can switch to integers.
Some languages have currency datatype with is scaled integer.


for example if howMuch is 0.90 and payment is 100, It returns 50 20 20 5 2 2 0.05 0.02 0.02 ... not 50 20 20 5 2 2 0.10


这篇关于为什么此代码忽略数组中的0.10和0.01值。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆