私が知っている 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 桁