将float转换为double为整数

时间:2014-05-16 21:00:55

标签: python c

我必须制作一个项目,包括计算形成数字所需的硬币数量。你有四分之一,硬币,镍币和硬币,你需要用尽可能少的硬币来形成一个数字。您需要表格的号码会提示给用户。

这在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 个答案:

答案 0 :(得分: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之间n的大多数0.0-1.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;

{{1}}

答案 1 :(得分:1)

你是正确的,你需要乘以100,然后转换为int,这就是你在python代码中所做的,但在你的C代码中你正在向后做 - 首先转换为int然后乘以100:

 int change = (int) n;
 change = change * 100;

该(int)强制转换将值截断为下一个最低整数,因此0到1之间的n值始终设置为0.

将乘法移动100可确保在转换为美分的整数之前将美元(例如0.56)转换为美分的浮点表示(例如56.0),例如(56):

int change = (int) (n * 100);