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

C++で定価に一割引き、三割引き、五割引きを表示する方法

このQ&Aのポイント
  • 最近C++をはじめた人が、Borland C++を使用して定価に一割引き、三割引き、五割引きを表示する方法を教えてください。
  • コードを実行すると、定価を入力した後に一割引き、三割引き、五割引きの金額が表示されます。
  • ただし、定価を入力したら表示される金額が699になってしまいます。どうして699なのか教えてください。

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.6

「打ち切り誤差」ってのは「本来無限に続くはずの計算を途中でやめちゃったために生じる誤差」だから, ここでの「誤差」とは違うような. それはさておき, (多くの) 計算機の内部では 2進数を使うため, 「10進数できりのいい小数」が無限小数になってしまい, それを有限のビット数で表現するために誤差が生じることはよくあります. 例えば, 手元の計算機では 0.7 を内部的に「0.69999999999999996」としていますので, これを 1000倍して整数に丸めると 699 になります. 逆に 0.9 は「0.90000000000000002」と本来の 0.9 よりわずかに大きい値になっていますが, 1000倍してから整数に丸めても (正の数では小数点以下を切り捨てるために) 900 と, 一見正しいように見えるわけです.

すると、全ての回答が全文表示されます。

その他の回答 (5)

回答No.5

7割が 699 になるのはよくある打ち切り誤差ですというのは、既に回答があるとおりです。 ちょっと補足ですが、浮動小数点を扱うときには、(float ではなくて) double をお勧めします。 実際、 price * 0.9 と書かれている、0.9 の型は (float ではなくて) double です。 ですから、 float a = 0.1; if (a == 0.1) .... という比較は失敗します。この場合も、0.1 は double なので、float 型への代入と比較で、予期せぬ型変換が発生するからです。 もう少し補足すれば、 price * 0.7 の計算結果は double です。 これは、int * double の計算は、「int を double に変換してから計算する」という決まりがあるからで、実際には、 (double)price * 0.7 という計算が行われます。 ( C++ で書けば、 static_cast<double>(price) * 0.7) ですから、この場合に限れば、price が int でも double でも同じ結果になります。

すると、全ての回答が全文表示されます。
回答No.4

C++をはじめたなら Cな書き方ではなくて C++な書き方を覚えた方が いいと思いますよ。

poohkodesu
質問者

お礼

さっそく、そうしてみます 回答ありがとうございます、

すると、全ての回答が全文表示されます。
  • i-q
  • ベストアンサー率28% (980/3445)
回答No.3

すいません%0.f(&0.f×)でした。 intは整数のみで小数点は扱えません。内部でどのように処理されてるのかはわかりませんが、強引に計算した結果699になるのでしょう。

poohkodesu
質問者

お礼

大変よくわかりました ありがとうございました

すると、全ての回答が全文表示されます。
  • i-q
  • ベストアンサー率28% (980/3445)
回答No.2

小数を扱うなら、intではなくfloat型のほうがいいです。 floatで宣言して、表示する時%d→&0.fに直せばOK。

すると、全ての回答が全文表示されます。
回答No.1

# タイトルは内容を端的に表すものを。 誤差により、 price*0.7 が 699.999… になっているのでしょう。 それをintに変換すると切り捨てられて699となります。

poohkodesu
質問者

お礼

回答ありがとうございました

すると、全ての回答が全文表示されます。

専門家に質問してみよう