C ++で特定の精度で数値を表示する方法について話している多くの投稿を見ましたが、x.0などの非反復数値とsetprecisionで指定された幅の反復数値を表示する方法があるかどうか疑問に思っていました方法?
2 に答える
出力したい数値が小数展開を繰り返すかどうかが事前にわかっている場合は、次の行に沿ってステートメントを発行するだけで済みます。
if is_recurring:
print using expanded format
else
print using fixed format
事前にわからないと思います。また、一般に、コンピューターもそれを知ることができません。
少数の小数 (倍精度を使用している場合は約 15) が循環小数を表しているかどうかをどのようにテストしますか?
さらに、どのように印刷しますか?たとえば、古典的な例を見てみましょう:
3227 / 555 = 5.814414414414414
どのように印刷すればよいですか?このような?
5.8144
またはそのような?
5.8144
***
一般的に対処するのは非常に難しい問題のようです。
本当に欲しいのは、末尾のゼロを削除することです。浮動小数点演算は有理数に基づいていないため、機械は数値が本当に「循環数」であるかどうかを知りません。
Adam が述べたように、デフォルトの出力スタイルはすでに末尾のゼロを省略しています。これは数学とはあまり関係ありません。文字列の末尾から文字を削除するだけです。
標準に関しては、ios_base::fixed
およびios_base::scientific
フラグが定性的な書式設定を決定します。%g
どちらも設定されていない場合、出力は の書式指定子と同等になりますprintf
。
によるとman printf
、
結果の小数部から末尾のゼロが削除されます。小数点は、その後に少なくとも 1 つの数字が続く場合にのみ表示されます。
上記の規則にもかかわらず最後に a を取得する.0
には、一時的な文字列に出力し、小数点を検索し、fixed
見つからない場合はモードで再試行するなどの操作を行う必要があります。