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

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

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

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

Q&A

4回答

8561閲覧

double型の有効数字以降の0を動的に消したい

kwiyy

総合スコア12

C

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

0グッド

0クリップ

投稿2019/05/22 09:11

タイトル通りの内容になります。

【やりたいこと】
double a = 0.000
a = 0にする

double b = 1.0000
b = 1にする

double c = 1.500000
c = 1.5 にする

double d = 0.32000
d = 0.32にする

のようにいくつか例をあげましたが
小数点以下の有効じゃない0を消したいです。
桁数は持ってくる値によってバラバラなので、可変的にしたいです。

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

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

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

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

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

ozwk

2019/05/22 09:30 編集

実際には2進数で保持しているので 例えばd=0.1とした場合、代入されるのは0.10000000000000000555111512312578270211815834045…ですけどどうするんです?
cateye

2019/05/22 11:18 編集

浮動小数点数には端数は付き物です。たとえば、1.000000001などの場合はどうしますか? printf()などで表示するだけなら桁数指定が出来ますが? また、他の方が言われているように、小数点以下の0もその桁まで“0が保証されている”という事ですから有効桁と考えますが?・・・どうでしょうか?
maisumakun

2019/05/22 09:45

一般的な環境の浮動小数点数では「0.32」という値は正確に表現できないのですが、そこはどうしますか?
pepperleaf

2019/05/22 11:30

"有効数字"ってなんでしょうか? 浮動小数点という事なので、内部は二進数。従って、二進数の有効桁数はあっても十進数での有効桁数は無いと思います。
jimbe

2019/05/22 12:16

どこかのスクリプト風に, 数値 と 数字(文字列) を混同されているのでしょうか. 「printf で a/b/c/d を表示したら 0.000/1.0000/1.500000/0.32000 と出た, 後ろの 0 が要らない...」 ということですか?
tiitoi

2019/05/23 01:20

浮動小数点演算は丸め誤差が発生するので、有効数字が正確に合っている桁数を指して言っているのだとしたら、「精度保証付き数値計算」ができるライブラリをお使いください。
guest

回答4

0

タイトルどおりというのならば何もする必要はありません。
0.000というのは4桁が有効な数字あって、末尾の0も無効な数字ではありません。

投稿2019/05/22 09:39

sage

総合スコア1240

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

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

0

%f の代わりに %g を使ってみてはいかがでしょうか?

#include <stdio.h> int main(void) { double a = 0.000; printf("a = %.15g\n", a); double b = 1.0000; printf("b = %.15g\n", b); double c = 1.500000; printf("c = %.15g\n", c); double d = 0.32000; printf("d = %.15g\n", d); }

投稿2019/06/03 08:58

kazuma-s

総合スコア8222

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

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

0

10進表記の誤差については、正確(ラウンドトリップ可能)かつ10進数で最短の表現を出力するDragon4というアルゴリズムがあるようです。
参考: 浮動小数点数の10進指数表示のアルゴリズム-WentWayUp
ただ、計算の結果として出た端数には効果が無いでしょうけれど。

(なんだか求められているものは「末尾の0を消す」な気もしますが…)

投稿2019/05/22 16:58

ikadzuchi

総合スコア3047

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

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

0

0~9と1個以下のピリオドで構成される文字列の中のピリオド以降の文字列の内、末尾の連続する0を消したいというのならば、まず、ピリオドがあることを確認し、あれば末尾から順に0ならば長さを-1して再度末尾が0かをチェックする、といったコーディングをすればいい。

投稿2019/05/22 09:45

sage

総合スコア1240

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問