簡體   English   中英

將浮點數轉換為雙精度整數

[英]Converting a float to a double to an integer

我必須創建一個項目,該項目包括計算形成一個數字所需的硬幣數量。 您有誇脫,角錢,鎳幣和幾美分,並且您需要形成一個數量最少的硬幣。 您需要填寫的號碼會提示用戶。

這在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中實現此功能,我遇到了一些麻煩。 我不太了解如何更改用戶提示的浮動。 我需要先將其轉換為兩倍,再乘以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中的float到int的轉換有什么問題嗎? 當用戶提示一個介於0和1之間的數字時,程序返回錯誤的結果(總是0)。

謝謝 !

問題

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;

沒錯,您需要乘以100,然后轉換為一個int,這就是您在python代碼中所做的,但是在您的C代碼中,您正在反向進行-首先轉換為int,然后乘以100 :

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

(int)強制將值截斷為下一個最小整數,因此n介於0和1之間的值將始終設置為0。

將乘數移動100可確保您在轉換為整數(例如(56))之前,將美元(例如0.56)轉換為美分(例如56.0)的浮點表示形式:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM