整数+少数の値の表示が少し変わる

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
初めたての人

整数+少数の値の表示が少し変わる

#1

投稿記事 by 初めたての人 » 8年前

コード:

#include < stdio.h >
void main()
{
	float a;
	printf("小数を入力してください:");
	scanf_s("%f", &a); 

	printf("入力した整数は%fです\n", a);
}
これを実行しaに例えば123.456を代入すると123.456001と表示されます。
この最後の1が付くのはなぜですか?また解決の仕方はありますか?

白い変人

Re: 整数+少数の値の表示が少し変わる

#2

投稿記事 by 白い変人 » 8年前

それは、浮動小数点を処理する上での誤差と考えるべきでしょう。

何処までを有効数字とするのかは、質問者様次第な部分がありますが、

printf("入力した整数は%fです\n", a);

のところを、

printf("入力した整数は%1.3fです\n", a);

という具合にでもしておけば、小数第3位までで綺麗に表示出来ると思われます。

実際のところ、この記述には、コンパイラ毎のローカルルールが有ったりする場合がありますので、注意が必要な場合もあります。

アバター
みけCAT
記事: 6734
登録日時: 14年前
住所: 千葉県
連絡を取る:

Re: 整数+少数の値の表示が少し変わる

#3

投稿記事 by みけCAT » 8年前

初めたての人 さんが書きました:この最後の1が付くのはなぜですか?
一般的な浮動小数点数(IEEE754)では小数を2進数で表現するので、10進数では有限小数の値でも2進数では無限小数になり、丸め誤差が生じることがあるためです。
初めたての人 さんが書きました:また解決の仕方はありますか?
この場合は、64ビットIEEE754の浮動小数点数は10進数で15桁程度の制度があるので、double型を使えば改善するかもしれません。
※double型が64ビットIEEE754の浮動小数点数とは限りません
もしくは、元の値をそのまま保持することが重要であれば、そもそも浮動小数点数に変換せず文字列のまま処理するといいでしょう。
複雑な問題?マシンの性能を上げてOpenMPで殴ればいい!(死亡フラグ)

返信

“C言語何でも質問掲示板” へ戻る