- ベストアンサー
C言語で二つの整数値の何%かを表示するプログラムの作成方法と、一部のコード修正の理由について
- C言語で二つの整数値を読み込み、前者の値が後者の何%かを実数で表示するプログラムの作成方法について説明します。
- 上記コードの中で、(n1 / n2) * 100の部分にキャスト演算子を使用しているため、結果が0.000000%となってしまいます。正しい結果を得るためには、n1 / n2 * 100という式にする必要があります。
- C言語の割り算の仕組みにより、(n1 / n2)という部分は整数同士の割り算となります。そのため、結果が整数となり、0となってしまいます。キャスト演算子を使わずに(n1 / n2) * 100とすることで、正しい結果を得ることができます。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
>(double)(n1 / n2) * 100 カッコ内の演算が優先だから、最初に n1 / n2 を やります。もし、n1 < n2 だと、答えは0ですね。 これをキャストしても、0にしかなりませんよね。 本筋から言うと、n1とn2をdoubleに変換してから 計算すべきです。更に演算誤差を考えると、乗算 から実施すべきです。高額の金利計算では数値が 大きいので、誤差が有効金額範囲に及ぶことが 稀にあります。私だと以下のようにします。 ((double)(n1 * 100)) / ((double)n2) カッコがくどいようですが、コンパイラの違いや、 マクロ内記述にしても絶対に間違えないように するための処置です。
その他の回答 (5)
- asuncion
- ベストアンサー率33% (2127/6289)
>#4さん >n1とn2をdoubleに変換してから いずれか一方だけで十分です。もちろん、両方ともキャストすることが間違いというわけではありません。
- kmee
- ベストアンサー率55% (1857/3366)
理由はすでに出ているので。 演算の順位と「暗黙の型変換」と利用するとこんな感じ 100.0 * n1 / n2 コンピュータで計算を行う場合、様々な事情から、数学の法則が通用しないケースがあります。 「公式」をそのまま使うのではなく、正しく計算できるように(誤差が少なくなるように)式を変形してやる必要があります。
- asuncion
- ベストアンサー率33% (2127/6289)
>どういう風に上手くいったのでしょうか 質問者さんの >最後のキャスト演算子を使用した後の式で という記載から、 (double) n1 / n2 * 100 と書いたらうまくいったんじゃないかなぁ、なんて勝手に想像してみました。
- TT414
- ベストアンサー率18% (72/384)
>そこで、最後のキャスト演算子を使用した後の式で(n1 / n2) * 100がまずいのかなと考え、n1 / n2 * 100にしたら上手くいきました。 どういう風に上手くいったのでしょうか、(n1 / n2) * 100とn1 / n2 * 100は同じです。上手くいった時のソースと実行結果を教えてください。
- shiren2
- ベストアンサー率47% (139/295)
キャストの位置ですね。 >(double)(n1 / n2) * 100 こうです。 >((double)n1 / n2) * 100 最初のやり方だと、int/intの結果はintですので、小数点以下が切り捨てられてしまいます。 一方が浮動小数点数だと、結果も浮動小数点数になります。