3


1

doubleに含まれる桁数を取得するにはどうすればよいですか?

次のdouble値の桁数を取得しようとしています:56.46855976を文字列に変換せずに使用します(「。」を単に「」に置き換えます)。

誰かアイデアがありますか?

3 Answer


5


数値を1未満になるまで10で除算する必要がある頻度をカウントします。これにより、小数点の前の数字が得られます。

次に、元の数値をMath.Floor-resultに等しくなるまで10で乗算する必要がある頻度をカウントします。これにより、小数点以下の桁数が得られます。

Add. 喜んで。

編集:Joeyが指摘しているように、それにはいくらかの不信があります。 無限ループを作成しないように、事前に最大桁数を定義します。 一方、「デンマークの海岸はどれくらいですか?」…​


1


    /// Returns how many digits there are to the left of the .
    public static int CountDigits(double num) {
        int digits = 0;
        while (num >= 1) {
            digits++;
            num /= 10;
        }
        return digits;
    }

Martinが述べたように、の右側に数えます。 無意味です。

テスト:

MathPlus.CountDigits(56.46855976)                 -> 2
MathPlus.CountDigits((double)long.MaxValue + 1)   -> 19
MathPlus.CountDigits(double.MaxValue)             -> 309


0


文字列に変換するのが最良の選択肢かもしれません。 「double」は内部的にBase 2で表されることに注意してください。 したがって、表示される10進数表現は、実際に保存されている値の近似値(2 ^ 53 ^までの整数を除く)であり、個々の2の累乗の合計です。

そのため、特にフレームワークは3.999999999998のような数値が実際よりも正確に見えるため4.0のように丸めるために丸めを適用する可能性があるため、バイナリ表現から10進数の桁数を計算しようとすることは確かに簡単または簡単な作業ではありません。