2011-09-15 12 views
2

私はコンピュータプログラミングの初心者です。私はプログラムを書いています。何らかの理由で、何らかの演算の浮動小数点値を計算しようとすると、0.00000という結果になります。誰かが私を助けてくれれば大いに感謝します!私は浮動小数点の助けが必要です

#include <stdio.h> 

    int main(void) 
    { 
      int numa, numb; 
      int sum, halffirst, halfsecond, quotient, remainder; 


      // get input 
      printf("\nPlease enter two integers: "); 
      scanf("%d%d", &numa, &numb); 

      // calculate dimensions 
      sum = numa + numb; 
      halffirst = (double)numa/2.0; 
      halfsecond = numb/2; 
      quotient = numa/numb; 
      remainder = numa % numb; 

      // display report 
      printf("\n%20s%20s", "Description", "Data"); 
      printf("\n%20s%20s", "-----------", "----"); 
      printf("\n%20s%20d", "Sum", sum); 
      printf("\n%20s%20lf", "Half (1st #)", halffirst); 
      printf("\n%20s%20d", "Half (2nd #)", halfsecond); 
      printf("\n%20s%20lf", "Quotient", quotient); 
      printf("\n%20s%20d", "Remainder", remainder); 

      // format and finish 
      printf("\n\n"); 
      return 0; 
    } 

答えて

0

すべての変数はintと宣言されています。

floatまたはdoubleを試してみてください。

1

intを使用する代わりに、正しい値を保存するには、変数をfloatまたはdoubleとして割り当てる必要があります。

double sum, halffirst, halfsecond, quotient, remainder; 

行置換:上記いずれかで

int sum, halffirst, halfsecond, quotient, remainder; 

を。

+0

ありがとうございます。どうすればよいですか?私は非常に新しい申し訳ありません... :( –

2

これは、データ型が整数のintを使用しているためです。操作は次のように整数(切り捨て)ので、何かを生成する傾向がある整数で行わ:

int nom = 6; 
int den = 10; 
float frac = nom/den; 

損傷された後、算術が(整数に行われ、唯一の終わりにfloat型に変換されているので、あなたにゼロの値が得られます完了)。

次の例のように、キャスティングすることによりこの問題を回避することができます:分割前の整数のうち、浮動小数点値を行います

float frac = (float)nom/(float)den; 

を。

しかし、浮動小数点を使用してすべての値を前面に表示する方がよいでしょう。 float(単精度)またはdouble(倍精度)は、後になっているものです。倍精度の値は、より正確な精度を持ちます。つまり、より多くの桁数とより広い範囲の数値を格納できます。クラスワークの場合は、floatが大丈夫でしょう。

+0

私のコードで私は(ダブル)numa/2.0を行ったなぜそれは私に0.000を与えるのですか?私はとても混乱していると私は泣いているように私を助けてください:( –

+1

@Sarah、even 'halffirst =(double)numa/2.0;'の右辺を二重に強制しても、それを 'halffirst'に入れてintにすると、切り捨てられます。それは私がウイスキーを注文するのではない:-)実際には、それらをすべて倍にして、最後のパラグラフを参照してください。 – paxdiablo

0

物事のカップル:

  1. あなたが変数として、浮動小数点数を使用する場合は、あなたがfloatではなくintとして、あなたの変数を宣言する必要があります。 CおよびC++では、数値を分割してintに代入すると、結果はすべての小数点を削除し、変数に格納されている実数のみが残されます。
  2. あなたがダイビングであり、あなたがあなたの分母の整数を持っている場合、あなたはそのように、フロートポイント数に整数をキャストする必要があります。

    int num1 = 1, num2 = 2; float theDiv = num1/(float)num2;

あなたがしないと小数点以下も削除します。

+0

私はまだ混乱しています。私はhalffirstを(double)numa/2.0と定義しています。だから、それはなぜ答え0.000を与えているのですか? –

+0

除算結果をintに格納するためです。フロートにする必要があります。 –

+0

ああ、あなたは完全に失われているように見えます。これを試してみてください:float halffirst =(double)numa/2.0; –

-1

種類は、初心者のプログラマーのための悪夢です。ここでは、 intの整数値と、倍精度浮動小数点数の doubleの2種類があります。

Cなどの言語は、型、キャスト、および強制について非常にペナルティです。 1つの式で複数の型を扱うときは、非常に注意する必要があります。あなたのラインを細分化する。halffirst = (double)numa/2.0;。例を挙げましょう。 numaは、5

  • 最初の値を持つdoublenumaをキャスト言います。これは問題ありません。あなたは今やあなたの約束事として5.0を持っています。
  • で割る。被除数5.0は倍精度であり、除数2.0は倍精度ですので、結果は(自然に)倍精度2.5になります。また、大丈夫です。
  • 結果をhalffirstに格納します。 halffirstintタイプです。 doubleの値をint変数に直接格納することはできません。したがって、それを変換する必要があります。 (int)2.5は2となるので、2をhalffirstに格納します。

あなたの部門のdouble結果を保存したい場合は、それ以外の場合は末尾に暗黙的な変換はあなたをホースになる、タイプdoubleとして、先の変数、halffirstを宣言する必要があります。 halfsecondも同じ理由で同じ方法です。したがって、main方法の一番上にあなたの宣言で、これを試してみてください。

int numa, numb; 
int sum, quotient, remainder; 
double halffirst, halfsecond; 

意味をなさない?いずれかの引数が 対応する変換の正しいタイプでない場合

1

C-99標準セクション7.19.6.1項9

変換指定が無効である場合によれば、動作は undefined.251)であります仕様では、動作は未定義です。

halffirstquotientintとして定義されていますが、printfの呼び出しで、あなたは標準に従って未定義の動作ですdouble

 printf("\n%20s%20lf", "Half (1st #)", halffirst); 
    printf("\n%20s%20lf", "Quotient", quotient); 

ための指定です%lfを使用しています。

使用%d整数

 printf("\n%20s %d", "Half (1st #)", halffirst); 
    printf("\n%20s %d", "Quotient", quotient); 

ORを印刷するには、

 printf("\n%20s%20lf", "Half (1st #)", (float)halffirst); 
    printf("\n%20s%20lf", "Quotient", (float)quotient); 

またはそれを渡す前にフロートするintを型キャストを渡す前にfloatに整数型キャスト。

関連する問題