将浮点数转换为双精度再转换为整数

1 投票
2 回答
4139 浏览
提问于 2025-04-18 06:48

我需要做一个项目,目的是计算出你需要多少硬币才能凑成一个数字。你可以使用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;

撰写回答