开发者

How can you get the number of digits contained in a double?

开发者 https://www.devze.com 2023-01-16 22:06 出处:网络
I\'m tryin开发者_StackOverflowg to get the number of digits in the following double value: 56.46855976 without using converting it to a string (and simply replacing the \".\" with a \"\").

I'm tryin开发者_StackOverflowg to get the number of digits in the following double value: 56.46855976 without using converting it to a string (and simply replacing the "." with a "").

Anybody got any ideas?


Count how often you must divide the number by 10 until it's smaller than 1 -> that gives you the digits before the decimal point.

Then count how often you must multiply the original number by 10 until it equals the Math.Floor-result -> that gives you the digits behind the decimal points.

Add. Be glad.

Edit: As Joey points out, there is some uncertianity in it. Define a maximum number of digits beforehand so you don't create an infinite loop. On the other hand - "How long is the coast of Denmark?"...


    /// 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;
    }

As Martin mentioned, counting to the right of the . is pointless.

Tests:

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


Converting to a string might be the best option you have. Remember that doubles are represented in Base 2 internally. Therefore the decimal representation you see is only an approximation of the actually stored value (except for integers up to 253) which is a sum of individual powers of 2.

So trying to figure out the number of decimal digits from the binary representation is certainly not an easy or trivial task – especially since the framework might also apply rounding to make numbers like 3.999999999998 appear like 4.0 since they appear to have more precision than there actually is.

0

精彩评论

暂无评论...
验证码 换一张
取 消