質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

1551閲覧

1.16 × 25 = 29なのですが、int型でキャストした場合とdouble型でキャストした場合で値が変わってしまいます。 なぜでしょうか?

oden_kun

総合スコア8

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2018/07/07 04:55

編集2018/07/07 05:15

具体的には、

c++

1(int)(1.16*25) 2```の値は、28 3```c++ 4(double)(1.16*25)

の値は、29

となってしまいます。
理由と解決策を教えてほしいです。

開発環境は、mac os x high sierra、コンパイラはg++です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

cateye

2018/07/07 05:03 編集

開発環境を教えてください
guest

回答2

0

ベストアンサー

こんにちは。

浮動小数点型の多くの内部表現は2進数です。その小数点以下の値を10進数で表現すると、0.5, 0.25, 0.125, ...を組み合わせて足したものです。
ですので、実は0.16をピッタリ2進数で表現することができません。
1.16 = 1.0 + 0.125 + 0.3125 + 0.0078125 + ...
有限桁の2進数で表現するため、最後は切り捨てなどで丸められています。
ですので、1.16の内部表現は、1.16よりほんの僅か小さな値になっているようです。
それを25倍すると、29よりほんの僅か小さな値になります。それを整数へ単純に変換するのでまるっと小数点以下が切り捨てられて28になります。

整数へ変換ぜずにdoubleで受けても同じく29よりほんの僅か小さな値(例えば、28.9999999999)になりますが、doubleは切り捨てずに記録できます。そしてそれを表示する際、小数点以下の数値は数桁程度で丸められます。その際四捨五入されますので、9が四捨五入されて切り上げられるため、29になります。

対策はint型へ変換する際に四捨五入する(例えばround)のが手っ取り早いです。
(なお、負の数の四捨五入には要注意です。四捨を0に近い方へ切り上げる、もしくは、0から遠い方へ切り捨てる2種類のやり方があります。)

投稿2018/07/07 05:24

編集2018/07/07 05:52
Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

printf("%10.20f", (double)(1.16 * 25));

で実行させると、

28.99999999999999644729

という結果になります

の値は、29

は、間違いだった、ってことですね


理由と解決策を教えてほしいです。

どういう解決がお望みなんでしょうか。

投稿2018/07/07 10:36

編集2018/07/07 10:39
y_waiwai

総合スコア87719

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

oden_kun

2018/07/07 10:43

1.16 * 25をint型の29として利用したかったので、floor(1.16*25 + 0.000001) とおいて解決しました ありがとうございました!
episteme

2018/07/07 23:48

ceil(1.16*25) でよくね?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問