【问题标题】:How can you get the number of digits contained in a double?如何获得双精度数中包含的位数?
【发布时间】:2023-03-05 01:33:02
【问题描述】:

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

有人有什么想法吗?

【问题讨论】:

  • 哇塞,怎么了:double d = 56.46855976; int length = d.ToString().Replace(".", "").Length;
  • 还要考虑到您看到的数字 (56.46855976) 只是一个值的表示。值 1/3 非常短,数字 0.33333... 不是。因此,除了查看问题外,数字的长度没有太多信息。

标签: c# digits


【解决方案1】:

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

然后计算你必须多久将原始数字乘以 10 直到等于 Math.Floor-result -> 为你提供小数点后面的数字。

添加。高兴吧。

编辑:正如 Joey 指出的那样,其中存在一些不确定性。预先定义最大位数,以免创建无限循环。 另一方面——“丹麦的海岸有多长?”...

【讨论】:

    【解决方案2】:
        /// 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
    

    【讨论】:

      【解决方案3】:

      转换为字符串可能是您拥有的最佳选择。请记住,doubles 在内部以 Base 2 表示。因此,您看到的十进制表示只是实际存储值的近似值(不超过 253 的整数),它是 2 的各个幂的总和。

      因此,试图从二进制表示中找出十进制数字的数量肯定不是一件容易或微不足道的任务——尤其是因为框架还可能应用舍入来使像 3.999999999998 这样的数字看起来像 4.0,因为它们看起来比确实有。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-26
        • 2018-03-10
        • 2017-01-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多