出力フォーマットについて

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

出力フォーマットについて

#1

投稿記事 by hash » 18年前

printf() 関数についてなのですが、
main(){
	double value = ???; // 定数
	printf("%g", value);
}
とすると、%g で指定される書式、
value = 123 なら、出力 123
value = 123.45678 なら、出力 123.45678
となりますが、valueが整数値であれば小数点以下の表示をせず、
valueが小数値であれば、小数点以下n桁目までしか表示させないような指定はできるのでしょうか?

小数点以下3桁までを指定したいとき、
"%.3f" とすれば、小数点以下3桁よりも長い場合は理想的な表示になりますが、
それより短い場合や整数値の場合には 123.000 などと表示されてしまいます。

"%.3g" では、小数点以下ではなく記号を含む全体の字数の指定になってしまいます。

小数点以下"3"桁までを表示させたいとして、
value = 123 のとき、出力 123
value = 123.000 のとき、出力 123
value = 123.45 のとき、出力 123.45
value = 123.45678 のとき、出力 123.456 (123.457)
value = 123.00000001 のとき、出力 123 または 123.000
value = 123.00099999 のとき、出力 123 または 123.000 (123.001)
※ 整数部分の桁数は不定です。

このように表示をしたい場合、適する表記はあるのでしょうか?

管理人

Re:出力フォーマットについて

#2

投稿記事 by 管理人 » 18年前

実数なら整数部と小数部にわければ行いたい事が出来るでしょう。

表示させる部分は
四捨五入無しの表示したいのならそのまま表示させればいいですし、
例えばもしxを小数点代N位で四捨五入するならこんな事も出来ます。
#include <stdio.h>
#include <math.h>
#define N 2.0

int main(){

	double p=pow(10.0,N);
	double x=3.4568172;

	x = (int)((x + 0.5/p)*p) / p;
	printf("%f",x);
	return 0;

}

出力結果

3.46
 


Justy

Re:出力フォーマットについて

#4

投稿記事 by Justy » 18年前

"%.3g" では、小数点以下ではなく記号を含む全体の字数の指定になってしまいます
 であれば、"3"の部分を "*"にして、自分でその数値を動的に決めて指定すれば
自由に桁制御ができるようになります。

[color=#d0d0ff" face="monospace]static void PrintfDoubleFloat3(double val)
{
    int digitIntegerPart = 0;
    double t = fabs(val);
    do
    {
        t /= 10.0;
        digitIntegerPart++;
    }
    while(t > 1.f);

    printf("%.*g\n", digitIntegerPart+3, val);
}[/color]

tk-xleader

Re:出力フォーマットについて

#5

投稿記事 by tk-xleader » 18年前

指数部と仮数部に分ける関数で指数部を求めるなんてのはどうでしょうか。
この動作をする関数はfrexp()を使えば問題ないと思います。浮動小数点数
は、10の何乗かで表していますから、詳しくは知りませんが、こんな感じ
でどうでしょうか。
include<stdio.h>
include<muth.h>

int main(void)
{
	int keta; /*10の何乗かを記憶する変数*/
	double num = 1.2345; /*適当な実数*/
	frexp(num,&keta);
	/* frexp(double,int *);
	  引数::実数、指数部の値を入れる変数のポインタ。
	  戻り値::仮数部(このプログラムでは使わないので無視)
	*/
	printf(%.*g\n",keta,num);
	return 0;
}
doubleが十進浮動小数点数ならうまくいくはずです。

Justy

Re:出力フォーマットについて

#6

投稿記事 by Justy » 18年前

>doubleが十進浮動小数点数ならうまくいくはずです
 C/C++で double型を十進浮動小数点で計算している環境ってものすごく少ないんじゃ・・・。

閉鎖

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