ページ 11

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

Posted: 2017年4月15日(土) 00:09
by 初めたての人

コード:

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

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

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

Posted: 2017年4月15日(土) 00:20
by 白い変人
それは、浮動小数点を処理する上での誤差と考えるべきでしょう。

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

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

のところを、

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

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

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

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

Posted: 2017年4月15日(土) 00:23
by みけCAT
初めたての人 さんが書きました:この最後の1が付くのはなぜですか?
一般的な浮動小数点数(IEEE754)では小数を2進数で表現するので、10進数では有限小数の値でも2進数では無限小数になり、丸め誤差が生じることがあるためです。
初めたての人 さんが書きました:また解決の仕方はありますか?
この場合は、64ビットIEEE754の浮動小数点数は10進数で15桁程度の制度があるので、double型を使えば改善するかもしれません。
※double型が64ビットIEEE754の浮動小数点数とは限りません
もしくは、元の値をそのまま保持することが重要であれば、そもそも浮動小数点数に変換せず文字列のまま処理するといいでしょう。