2017-01-27 14 views
-1

一定の間隔で、出力は0.1だけオフになります。型キャストの配列

私は配列centを変換しようとしましたが動作しませんでした。私は、配列を格納するために余分な値を宣言し、その値を変換しようとしましたが、トリックもしませんでした。

どのようにこれを修正できますか?

#include <stdio.h> 

int main(void) 
{ 
    float amount[5]; 
    long dollar[5]; 
    long cent[5]; 
    float storage = 0; 
    int i = 0; 

    printf("Enter five values: \n"); 

    for (int i = 0; i < 5; ++i) 
    { 
     scanf("%f", &amount[i]);// 2.75 

     dollar[i] = (long) amount[i]; // 2. 
     cent[i] = ((float)amount[i] - dollar[i]) * 100.00;//.75 

     printf("$%ld.%ld.\n",dollar[i],cent[i]); 
    } 
} 
+2

'(float)amount [i]'のキャストは不要です。これは 'amount [i]'は既に 'float'です。 –

+0

右!それについて申し訳ありません! –

+2

いくつかの入力例とその期待出力と実際の出力を示してください。 –

答えて

0

浮動小数点数は、すべての数値の正確な表現を格納することはできません。

私はscanfの後に次の行を追加する場合:

printf("amount=%.8f\n", amount[i]); 

を、私はこの出力を得る:

Enter five values: 
1.1 
amount=1.10000002 
$1.10. 
1.2 
amount=1.20000005 
$1.20. 
1.3 
amount=1.29999995 
$1.29. 
1.4 
amount=1.39999998 
$1.39. 
1.5 
amount=1.50000000 
$1.50. 

あなたは値が近似していることがわかります。いくつかはやや高く、若干低くなっています。 ((float)amount[i] - dollar[i]) * 100.00を計算すると整数部分は1分の1になりますが、小数部分は少しになります。この値を整数型に代入すると、その値が切り捨てられます。

あなたは最も近い整数にこの結果を丸めるためにroundf機能を使用する必要があります:あなたは、コンパイル時に

cent[i] = roundf(((float)amount[i] - dollar[i]) * 100.00); 

は、上部に#include <math.h>に必ず、および数学ライブラリ内のリンク。

+0

これはうまくいきました。ありがとう! – GFM

0

試してみてください。

cent[i] = (amount[i] * 100.00) - (dollar[i]*100);

による浮動小数点で丸め誤差します。

関連する問題