C/C++ は小数点以下の桁数を数えますか?

私が知っている 2 つの方法は、残念ながらあまり賢くはありませんが、これは私というよりも環境の制限です :-)

まずはsprintf"%.50f" の大きなバッファへの番号 フォーマット文字列で、末尾のゼロを取り除き、小数点以下の文字を数えます。これは printf によって制限されます 家族そのもの。または、ユーザーによる入力として文字列を使用することもできます (sprintf ではなく)。 浮動小数点の問題を完全に回避するためです。

2 つ目は、整数部分を減算してから、繰り返し 10 を掛け、ゼロになるまで整数部分を再度減算することです。これは、浮動小数点数のコンピューター表現の制限によって制限されます。各段階で、正確に表現できない数値の問題が発生する可能性があります (したがって、.2155 は実際には .215499999998 になる可能性があります)。次のようなもの (COMX-35 とほぼ同等の頭の中を除いて未テスト):

count = 0
num = abs(num)
num = num - int(num)
while num != 0:
    num = num * 10
    count = count + 1
    num = num - int(num)

取得する数値の種類がわかっている場合 (たとえば、小数点以下はすべて 0 から 4 桁になる)、標準の浮動小数点の「トリック」を使用して適切に行うことができます。たとえば、代わりに:

while num != 0:

使う

while abs(num) >= 0.0000001:

数値がユーザー表現 (文字列、OCR 化された gif ファイルなど) から浮動小数点数に変換されると、必ずしも同じ数値を扱うとは限りません。したがって、あまり役に立たない厳密な答えは「いいえ」です。

If (ケース A ) 文字列表現から数値を変換することを避けることができます。問題ははるかに簡単になります。小数点以下の桁数を数え、末尾のゼロの数を引くだけで済みます。

できない場合 (ケース B) )、次に、小数点以下の最大数について仮定し、数値を文字列表現に変換し、偶数への丸め方法を使用してこの最大数に丸める必要があります。たとえば、ユーザーが 1.1 を指定すると、1.09999999999999 (仮説) として表され、それを文字列に変換すると、"1.09999999999999" となります。この数値を、たとえば小数点以下 4 桁に丸めると、「1.1000」になります。 ケース A に戻ります .


頭のてっぺんから:

小数部分から始めます:.2155

繰り返し 10 を掛け、ゼロになるまで数値の整数部分を捨てます。ステップ数は小数点以下の桁数になります。例:

.2155 * 10 = 2.155
.155 * 10 = 1.55
.55 * 10 = 5.5
.5 * 10 = 5.0

4 ステップ =小数点以下 4 桁