如何解决有没有办法将0.15转换为15
我想转换一个0.15 -> 15
或0.4 -> 4
之类的浮点数
我的想法是
-
将数字乘以浮点位数。
-
在地板上
-
将其发布为(int)。
无法确定第一步。
说明:我必须编写一个使用贪婪算法的程序,用户输入change_owed。然后,该程序将检查可能发出的最小硬币数。
代码:
#include <ctype.h>
#include <stdio.h>
int main(void)
{
int coins = 0;
float cash_owed = 0;
do
{
printf("Cash owed: ");
scanf("%f",&cash_owed);
}
while(cash_owed < 0);
while(cash_owed > 0)
{
if(cash_owed >= 0.25)
{
cash_owed -= 0.25;
printf("Cash owed: %f\n",cash_owed);
coins++;
printf("Coins: %d\n",coins);
}
else if(cash_owed >= 0.10)
{
cash_owed -= 0.10;
printf("Cash owed: %f\n",coins);
}
else if(cash_owed >= 0.05)
{
cash_owed -= 0.05;
printf("Cash owed: %f\n",coins);
}
else
{
cash_owed -= 0.01;
printf("Cash owed: %f\n",coins);
}
}
printf("%d\n",coins);
return 0;
}
不是我最好的设计。但这在下面给出的许多不同示例中都失败了,据我所知,这是由于浮点算术不精确。
失败:0.15、1.6和4.2。其中由于浮点算术不精确性而跳过一个或多个if语句。
因此,我设计了一个新算法,将这些值转换为适当的int。喜欢
0.15 -> 15
所以我必须使用整数来消除浮点错误,如果这有意义的话
解决方法
转换一个浮点数,例如0.15-> 15或0.4-> 4
-
识别0.15和0.4不能精确地编码为浮点数,因为它们通常不是dyadic,例如: binary32。而是将附近的值保存在
cash
中。 -
将浮点数乘以100。由于乘积确定可能会四舍五入,而原始数可能仅接近几位数的十进制数,因此请四舍五入。使用 floor 可能会将xxx.9999 ...的值改为xxx.0,而不是更合理的xxx.0 + 1。
#include <math.h> long cash_in_cets = lround(cash * 100.0);
使用整数数学和整数美分进行其余的贪婪算法,
我的水晶球暗示下一个版本的C将指定十进制浮点数,这是一个很好的解决方案。
仅使用FP类型可以保留代码,但是像(cash_owed >= 0.10)
这样的测试过于简单/错误,需要大量的返工。最好转向整数数学。
您无需将浮点数转换为整数即可使程序正常工作。 据我所知,问题在于您的程序一旦变为0,就不知道要做什么,这可能是因为它从未真正达到绝对零。解决此问题的一种方法是添加其他else if语句,只要该语句将cash_owed小于0.01设置为小于0:
else if(cash_owed < 0.01)
{
cash_owed = -1;
}
您还需要在现有的0.01 else if语句中添加条件:
else if(cash_owed >= 0.01)
{
cash_owed -= 0.01;
printf("Cash owed: %f\n",cash_owed);
coins++;
printf("Coins: %d\n",coins);
}
因此,您的while循环最终看起来像这样:
while(cash_owed > 0)
{
if(cash_owed >= 0.25)
{
cash_owed -= 0.25;
printf("Cash owed: %f\n",coins);
}
else if(cash_owed >= 0.10)
{
cash_owed -= 0.10;
printf("Cash owed: %f\n",coins);
}
else if(cash_owed >= 0.05)
{
cash_owed -= 0.05;
printf("Cash owed: %f\n",coins);
}
else if(cash_owed >= 0.01)
{
cash_owed -= 0.01;
printf("Cash owed: %f\n",coins);
}
else if(cash_owed < 0.01)
{
cash_owed = -1;
}
}
只要您的用户输入有效金额,此方法就应该起作用(因此,您可能要添加支票以确保他们添加的位数不超过2个小数)。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。