【问题标题】:Get how many decimal digits there is after a dot获取点后有多少个十进制数字
【发布时间】:2021-04-19 07:14:17
【问题描述】:

我想计算小数点后的位数。我的程序可以运行,但是当我添加更多数字时它会返回错误的数字,例如,5.55266666666555555 小数点后有 17 位,但我的程序只返回 15。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Result is: {0}", howMuchDots(5.55266666666555555));
    }

    static double howMuchDots(double num)
    {
        /* Convert num to string, split it with dot into an array, and take the second cell. Then get the length of the string */
        return num.ToString().Split(".")[1].Length;
    }
}

我尝试改用float,但它也不起作用。

【问题讨论】:

  • @SomeBody 是的,我就是这么想的,那我为什么要这么做?
  • 请注意,将 double 格式化为字符串通常会进行一些简化。使用“G17”格式查看所有血腥细节。但是,如果您要突破双精度的极限,那将无济于事
  • 由于您正在处理精确到许多有效数字的数字,并且您需要准确地表示以 10 为基数的数字(没有转换为以 2 为基数的更改),使用它可能会更好decimal 而不是 double: dotnetfiddle.net/GgMPe7
  • 在这种情况下可能不相关,但还要考虑浮点数上的 ToString 插入当前区域性的小数分隔符,并且并非所有区域性都使用 .分隔小数部分。例如,在我的机器上,您的代码在拆分调用时失败。因为除了逗号之外别无意义

标签: c#


【解决方案1】:

通常,浮点、双精度和十进制数据类型之间的区别在于精度,因此也在于使用多少内存来保存它们。浮点数是最便宜的——它可以代表一个最多 7 位的数字。双精度更精确,最多 16 位,而小数最精确,最多 29 位。

您只需将参数的类型更改为小数。

using System;

class Program
{
    static void Main(string[] args)
    {
        Console.WriteLine("Result is: {0}", howMuchDots(5.55266666666555555m));
    }

    static int howMuchDots(decimal num)
    {
        var length = (num - Math.Truncate(num)).ToString().Length - 2;
        return length > 0 ? length : 0;
    }
}

【讨论】:

  • 请注意,float 和 double 的精度限制并不是硬性限制——例如,float 的精度在 6 到 9 位之间,具体取决于您尝试的确切数字代表。
  • 虽然真实陈述它与问题的关系 - “点后有多少十进制数字”......即可以为 1.234567e10 写一些好词 - 点后是否有 6 个数字或零...
  • 这个答案有一些问题。首先它假设点是分隔符,但情况并非总是如此,然后它不处理没有小数的数字。第三,仅使用单个字符串参数的拆分在 NET Framework 上不起作用(适用于 core 或 net5)
  • 如果您尝试您的示例,结果将是 17。num 不是双精度而是小数
【解决方案2】:

您说要使用小数,但您的方法需要双精度。

假设您确实想使用小数,这是可行的。尝试使用GetBits 方法将多个 Decimal 值转换为等效的二进制表示。

using System;

namespace ConsoleApp7
{
    class Program
    {
        static void Main(string[] args)
        {
            decimal[] decimalValues = { 1M, 100000000000000M, 10000000000000000000000000000M,
                100000000000000.00000000000000M, 1.0000000000000000000000000000M,
                123456789M, 0.123456789M, 0.000000000123456789M,
                0.000000000000000000123456789M, 4294967295M,
                18446744073709551615M, decimal.MaxValue,
                decimal.MinValue, -7.9228162514264337593543950335M, 5.55266666666555555M };

            foreach (var num in decimalValues)
            {
                Console.WriteLine($"{num} Result is: {howMuchDots(num)}");
            }
            Console.ReadLine();
        }
        static double howMuchDots(decimal num)
        {
            return  (decimal.GetBits(num)[3] >> 16) & 0x000000FF;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-01
    • 1970-01-01
    • 2020-08-27
    • 1970-01-01
    • 2023-02-22
    • 2022-11-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多