将浮点数转换为双精度再转换为整数
我需要做一个项目,目的是计算出你需要多少硬币才能凑成一个数字。你可以使用25美分的硬币、10美分的硬币、5美分的硬币和1美分的硬币,目标是用尽可能少的硬币来组成这个数字。用户会输入这个数字。
在Python中,这个实现起来非常简单(我写了一个函数来快速处理这个问题):
def calculate_change(change):
count = 0
change*=100
change = int(change)
if change // 25 != 0:
count = change // 25
change = change % 25
if change // 10 != 0:
count += change // 10
change = change % 10
if change // 5 != 0:
count += change // 5
change = change % 5
if change // 1 != 0:
count += change // 1
print count
calculate_change(73)
现在,我想在C语言中实现这个功能,但遇到了一些麻烦。我不太明白如何处理用户输入的浮点数。我需要先把它转换成双精度浮点数(double),然后乘以100,最后再转换成整数(int),但我在这个过程中遇到了问题。
int main(void)
{
float n;
do
{
printf("Change you need: ");
n = GetFloat();
}
while (n < 0);
n = floorf(n * 100 + 0.5) / 100;
int change = (int) n;
change = change * 100;
int count = 0;
if (change / 25 != 0)
{
count = change / 25;
change = change % 25;
}
if (change / 10 != 0)
{
count = count + change / 10;
change = change % 10;
}
if (change / 5 != 0)
{
count = count + change / 5;
change = change % 5;
}
if (change / 1 != 0)
{
count = count + change / 1;
change = change % 1;
}
printf("%d\n", count);
}
在C语言中,从浮点数转换到整数时有什么问题吗?当用户输入一个在0到1之间的数字时,程序总是返回错误的结果(总是0)。
谢谢!
2 个回答
1
你说得对,确实需要先乘以100,然后再转成整数,这在你的Python代码里做得很好。但是在你的C代码里,你的顺序反了——先把数字转成整数,然后再乘以100:
int change = (int) n;
change = change * 100;
这个(int)转换会把数字截断到下一个最小的整数,所以在0到1之间的数字n,最后都会变成0。
把乘以100的步骤放在前面,可以确保你把美元(比如0.56)转换成浮点数形式的分(比如56.0),然后再转成整数形式的分(比如56):
int change = (int) (n * 100);
3
问题
当 n = 0.5
时,
floorf(n * 100 + 0.5) / 100 = floorf(50.5)/100 = 50/100 = 0.5
因此,这个说法
n = floorf(n * 100 + 0.5) / 100;
并不会改变 n
的值。现在,当你执行:
int change = (int) n;
change
被设置为 0
。这就解释了为什么在 0.0-1.0
之间的大多数 n
值你会得到 0
。
解决方案
我会把以下几行替换为:
n = floorf(n * 100 + 0.5) / 100;
int change = (int) n;
change = change * 100;
用
n = floorf(n * 100 + 0.5); // Just to make sure rounding occurs properly.
// Thanks to Mark Ransom.
int change = (int) n;