• ベストアンサー

printfの%eで指数部分の桁数を調整する方法?

書式指定子の%eで、8文字までで出力しなければなりません。 printf("data = %8.3e\n",data); 仮にdataが6.456e5の場合、 data = 6.456e+005 (既に10文字でオーバー) となってしまい、指数部の桁数が3桁になってしまうと 有効数字部分が少なくなってしまうので、 指数部を、1桁にする方法はあるのでしょうか? こんな感じで出力できるでしょうか? data = 6.456e+5

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

  • ベストアンサー
  • Oh-Orange
  • ベストアンサー率63% (854/1345)
回答No.2

★アドバイス ・一度バッファに『%5.3e』として出力して下さい。  そのバッファ(文字列)から指数部のゼロ2桁を削除すれば8文字になりませんか。 サンプル: double data = 6.456e+5; char buff[ 16 ]; sprintf( buff, "%5.3e", data ); // buff=『6.456e+005』 buff[ 7 ] = buff[ 9 ]; buff[ 8 ] = '\0'; printf( "data = %s\n", buff ); 以上。

yyamada10
質問者

お礼

文字列を操作するのですね。 非常に良く分かりました。 どうもありがとうございました。

その他の回答 (2)

  • jacta
  • ベストアンサー率26% (845/3158)
回答No.3

正攻法でいくなら、 double data = 6.456e5; int e = (int)log10(fabs(data)); printf("%.3fe%d\n", data / pow(10,e), e); ですかね。

yyamada10
質問者

お礼

ご教示ありがとうございます。 指数部のみを取り出して表示する方法 例文を示して頂いたので非常に良く分かりました。 %e使用時の書式指定子のオプションで対応可能なのかと 予想していたのですが、ないのですね。 どうもありがとうございました。

  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.1

ランタイム依存みたいですよ VC2005の場合 _set_output_format()で 2桁、3桁の制御は出来るようです

yyamada10
質問者

お礼

ご教示ありがとうございました。 MSDNの下記ページで確認できました。 http://msdn2.microsoft.com/ja-jp/library/0fatw238(VS.80).aspx ただ、やはり2桁までしか圧縮できないようです。 2桁が許容できる場合は、すっきりしているので、 こちらを利用したいと思います。 どうもありがとうございました。

関連するQ&A

  • printfの小数点以下の表示桁数につい

    Java超初心者です。宜しくお願い致します。 System.out.printf("%8f\n",15.8); は8桁表示のはずですが、 実行すると、 15.800000 と、いう風に9桁になります。 詳しい方はきっと当たり前と思うと思いますが、 小数点以下の桁数がどういう基準で決められるのか、 つまりゼロ(0)がいくつ並ぶか、というのがよくわかりません。 %12f に変更すると、    15.800000 と、左側にスペースが3つ入ります。 12桁と指定しても、小数点以下のゼロが5つだから、左にスペースが3つ入るわけですよね。 結局、小数点以下の桁数を指定していないのに勝手にゼロが並ぶので、 表示は実行してみるまでどうなるか解らない、という状況です。 規則というか、ルールを解りやすく教えて頂けると嬉しく思います。 宜しくお願い致します。

    • ベストアンサー
    • Java
  • エクセルの条件つき書式を別のセルに適用させる

    お世話になっております。m(_ _)m エクセルに「条件つき書式」という機能があります。 これは、「設定をしたセルの書式」を制御するものですが、条件の指定に使うセルと書式を設定したいセルが別の場合は、どのようにすればよいのでしょうか?可能なのでしょうか? やりたいことは、A1のセルに入っているデータが8桁なら書式を「00000000(ゼロ8個)」とし、9桁なら「000000000(ゼロ9個)」というようにしたいのです。 このような設定をしなければならない理由は、このセルに入るデータは桁数が8桁か9桁で、数字か文字か決まっていないデータが入ります。 例)00123445   E0123456   012345678   Z12345678 等 「E0123456」や「Z12345678」が入る場合は文字列としてデータが扱われてもかまわないのですが、「00123445」や「012345678」は「数値」として扱いたいのです。 「00123445」の場合、数値としてこの数字を表示したければ書式を「00000000(ゼロ8個)」とすればよいと思います。 しかし、このセルには9桁の「012345678」というデータが入る可能性があります。このデータも数字として扱いたいので「000000000(ゼロ9個)」とすればよいとなります。 しかし、ゼロ9個の書式設定をしてしまうと、8桁の数字が「000123445」と表示されてしまいます。それでは困ります。 8桁は8ケタ、9桁は9ケタで、0から始まる数字を表示したい場合、どのようにすれば表示できるでしょうか? 長くなりましたが回答をお願いします。

  • Java 出力 桁数調整

    Java初心者です。 JAVAのSytem.out.printの出力の際、 double型の数字の桁数(小数点以下何桁まで表示するか)を調整したいのですが、どのようにやればいいのかわかりません。 教えてください。 あまり詳しくないのでライブラリ等から探す探し方ではなく、 具体的なやりかたを教えてください。 <for emaxple> class warizan{ public static void main(String[] args){ double i=0.0; i = 1/3; System.out.println(i); } } をコンパイルして実行すると出力が 0.33333333333333333333333... となると思うんですが、 0.33 など、小数点以下二桁で出力する方法。 また、よければ大きい数字の桁数調整のやり方も 教えていただけるとうれしいです。 123456789 → 123000000

    • ベストアンサー
    • Java
  • Perlで実行は確認できましたただし・・・

    printfの書式指定 書式を指定してデータを出力できる。 printf("1"); 文字列をそのまま表示 printf("%d",1); リテラルを書式指定して表示 $a=1; printf("%d",$a); 変数を書式指定して表示 %dは整数を表示する書式指定です。 %d自身は表示されません。 書式 %d: 整数(少数点の付いていない数)を10進数で表示→ 2,3,-3 %x: 整数を16進数で表示→ 1,a %X: 整数を16進数で表示→ 1,A %f: 実数(少数点の付いている数)を表示→ 1.00000,0.1111 %c: 整数をASCIIコード表に対応する文字で表示→ a,A %S: 文字列を表示→ A,ABC,あ 桁数 printf("%4d",25); 空白を含めて4文字で表示 _ _ 2 5 printf("%04d",25); 0を使って4文字で表示 0 0 2 5 printf("%.3f",3.14); 少数点以下を3文字で表示 3 . 1 4 0 $a=10; 変数$aに10を代入。 $b=3.14; 変数bに3.14を代入。 printf("%10d\n",$a); 10を表示。 printf("X%8.5f\n",$b); X 3.14000を実数として表示。 printf("-" x 10 . "\n"); - を10回表示させる。 printf("%10f\n",$a*$b); $aと$bをかけたものを実数として表示する。 とありますが printf("%10d\n",$a); の %10 の意味が良く分かりません。 printf("X%8.5f\n",$b); の %8.5 の意味が良く分かりません。 printf("%10f\n",$a*$b); の %10 の意味が良く分かりません。 printf("X%8.5f\n",$b); の実行結果は左に一桁ずれていますなぜですか。 ご教示お願い致します。

    • ベストアンサー
    • Perl
  • エクセルの指数化け!?

    いま大変困っています。 会社のホストコンピュータからエクセルにデータをダウンロードをします。 これはエクセルでファイルが出力されるので最初からエクセルに書式を設定はできません。 そのデータのうち、おびただしい契約のコード(5桁)があるのですが、 たとえば 10A15 1G123 20B25 3013F 3A555 AX121 のようなもので、英数半角です。(数字だけもあります。) 通常は何も問題がないのですが、途中にEが入ると、 201E7→2.01E+09 2E137→2.00E+137 1E231→1.00E+231 10E75→1.00E+76 101E8→1.01E+10 のように文字化け(指数化け)してしまいます。 わたしの仕事は、この5桁のコードを、先頭の2桁と後ろの3桁に分けたいのですが、指数からではできません。 エクセルでなくCSVなどのテキスト形式で出力してもらえばいいのでしょうが、かなり時間がかかりそうで、当面は化けたエクセルから判読するほかなさそうです。 何か良い方法はないでしょうか? 関数でも、VBAでもかまいません。 お助けください。

  • Excel:文字と数字の間に数字を追加するマクロ。

    こんばんは、よろしくお願いします。 csvのデータで数字とかなが下記のようなデータがあります。 ※処理前 頭の数字以降は、文字と数字がランダムなデータ。全体の文字数もランダム 900000000000085600000008~0051038901フ(半角)~ 20000000000008560000008~0051038902サ~ ※処理後 900000000000085600000008~0000510389フ~ 20000000000008560000008~0000510389サ~ というようなデータの 半角カナの前の数字2ケタを削除し、10桁前に00を追加するようなマクロをExcelで作成したいのですが、 カナの前の数字の桁数が一定ではないこと、またカナの前の数字の桁数が多いため(40桁以上) のため指数表記になってしまう。 という、2点で困っています。 データ数が多くなることを考えると、前から1文字ずつ検索し、 判断していくのは、難しいかなと考えております。 Val関数で、取得しようとしたのですが、指数表記で上手く行きませんでした。 どのように、処理すればよろしいでしょうか。 お教え下さい。

  • エクセルでの桁数の違う小数の表示方法?

    エクセルでの小数点以下の桁数が異なる数字で四捨五入して連続する0以外の数字が2桁までに表示する方法を教えてほしいのですが・・・ 説明の仕方がわかりずらいので例をあげると、 1.25なら1.3 0.2274なら0.23 0.000304なら0.0003 となるようにしたいのですが、それぞれ桁数が違うので一度にできません。A4サイズで100以上あるので最初に設定するか、範囲指定をすべての数字にして一度で変換するする方法がよいのですが・・・ よろしくおねがいします。

  • 指数表示しない方法

    アクセスデータをエクセルに変換する時、文字列(1D00051)がはいているセル一部が指数表示になってしまいます。 書式設定でいくら文字列に変更しても変わらないです。 指数表示を元の文字列に戻したいですがなかなかできません。 資料一部を添付しますので 宜しくお願い致します。

  • 出力する桁数

    出力する桁数を指定することは可能なのでしょうか。 C言語であれば printf("%5.2lf",x); という風にすれば出来たと思います。 ではJavaではどういう書式になるのでしょうか。

    • ベストアンサー
    • Java
  • エクセルで桁合わせ!

    エクセルでA列に文字形式の数字があります. 例 0123 12345 234567 この文字形式の数字を仮に7桁で統一したいとします. 先頭に足りない桁は0を付加します. 変換後 0000123 0012345 0234567 このようにしたいのです. 列にあるデータごとに0を桁数分だけ付加していけばいいのですが このようなデータがたくさんあるので なにかいい方法がありましたら教えてください. お願いします.

専門家に質問してみよう