如何获得双精度数中包含的位数?

时间:2010-09-16 11:42:59

标签: c# digits

我正在尝试获取以下double值中的位数:56.46855976而不使用将其转换为字符串(并简单地将“。”替换为“”)。

有人有任何想法吗?

3 个答案:

答案 0 :(得分:5)

计算您必须将数字除以10的频率,直到它小于1 - >它给你小数点前的数字。

然后计算你必须将原始数字乘以10的频率,直到它等于Math.Floor-result - >它给你小数点后面的数字。

添加。很高兴。

编辑:正如乔伊指出的那样,其中存在一些不确定性。事先定义最大位数,这样就不会创建无限循环。 另一方面 - “丹麦海岸有多长时间?”......

答案 1 :(得分: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;
    }

正如马丁提到的,指向右边的。毫无意义。

试验:

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

答案 2 :(得分:0)

转换为字符串可能是您拥有的最佳选择。请记住,double在内部表示为基数2。因此,您看到的十进制表示只是实际存储值的近似值(除了最大2 53 的整数),它是2的单个幂的总和。

因此,尝试从二进制表示中计算出十进制数字的数量肯定不是一件容易或琐碎的任务 - 特别是因为框架也可能应用舍入来使像3.999999999998这样的数字看起来像4.0,因为它们似乎比实际上就是。