• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:c言語について)

C言語で二つの整数値の何%かを表示するプログラムの作成方法と、一部のコード修正の理由について

このQ&Aのポイント
  • C言語で二つの整数値を読み込み、前者の値が後者の何%かを実数で表示するプログラムの作成方法について説明します。
  • 上記コードの中で、(n1 / n2) * 100の部分にキャスト演算子を使用しているため、結果が0.000000%となってしまいます。正しい結果を得るためには、n1 / n2 * 100という式にする必要があります。
  • C言語の割り算の仕組みにより、(n1 / n2)という部分は整数同士の割り算となります。そのため、結果が整数となり、0となってしまいます。キャスト演算子を使わずに(n1 / n2) * 100とすることで、正しい結果を得ることができます。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.4

>(double)(n1 / n2) * 100 カッコ内の演算が優先だから、最初に n1 / n2 を やります。もし、n1 < n2 だと、答えは0ですね。 これをキャストしても、0にしかなりませんよね。 本筋から言うと、n1とn2をdoubleに変換してから 計算すべきです。更に演算誤差を考えると、乗算 から実施すべきです。高額の金利計算では数値が 大きいので、誤差が有効金額範囲に及ぶことが 稀にあります。私だと以下のようにします。 ((double)(n1 * 100)) / ((double)n2) カッコがくどいようですが、コンパイラの違いや、 マクロ内記述にしても絶対に間違えないように するための処置です。

その他の回答 (5)

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.6

>#4さん >n1とn2をdoubleに変換してから いずれか一方だけで十分です。もちろん、両方ともキャストすることが間違いというわけではありません。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.5

理由はすでに出ているので。 演算の順位と「暗黙の型変換」と利用するとこんな感じ 100.0 * n1 / n2 コンピュータで計算を行う場合、様々な事情から、数学の法則が通用しないケースがあります。 「公式」をそのまま使うのではなく、正しく計算できるように(誤差が少なくなるように)式を変形してやる必要があります。

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

>どういう風に上手くいったのでしょうか 質問者さんの >最後のキャスト演算子を使用した後の式で という記載から、 (double) n1 / n2 * 100 と書いたらうまくいったんじゃないかなぁ、なんて勝手に想像してみました。

  • TT414
  • ベストアンサー率18% (72/384)
回答No.2

>そこで、最後のキャスト演算子を使用した後の式で(n1 / n2) * 100がまずいのかなと考え、n1 / n2 * 100にしたら上手くいきました。 どういう風に上手くいったのでしょうか、(n1 / n2) * 100とn1 / n2 * 100は同じです。上手くいった時のソースと実行結果を教えてください。

  • shiren2
  • ベストアンサー率47% (139/295)
回答No.1

キャストの位置ですね。 >(double)(n1 / n2) * 100 こうです。 >((double)n1 / n2) * 100 最初のやり方だと、int/intの結果はintですので、小数点以下が切り捨てられてしまいます。 一方が浮動小数点数だと、結果も浮動小数点数になります。

関連するQ&A