C# 获取一个点后的小数位数

C# 获取一个点后的小数位数,c#,C#,我想计算小数点后的位数。我的程序可以工作,但当我添加更多数字时,它返回错误的数字,例如,5.5526666555555在小数点后有17位,但我的程序只返回15位 using System; class Program { static void Main(string[] args) { Console.WriteLine("Result is: {0}", howMuchDots(5.55266666666555555)); }

我想计算小数点后的位数。我的程序可以工作,但当我添加更多数字时,它返回错误的数字,例如,
5.5526666555555
在小数点后有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
,但它也不起作用。

一般来说,float、double和decimal数据类型之间的区别在于精度,因此也在于用于保存它们的内存量。浮点是最便宜的一个-它可以代表一个最多7位数的数字。双精度更高,最多为16位,而十进制精度最高,最大为29位

您只需要将参数的类型更改为decimal

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

您说您想使用十进制,但您的方法使用双精度

假设您真的想使用十进制,这是可行的。尝试使用方法将几个十进制值转换为其等效的二进制表示形式

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

Double的精度只有15-17位:@someone是的,这就是我的想法,那么,我为什么要这样做呢?请注意,将Double格式化为字符串通常会做一些简化。使用“G17”格式查看所有血淋淋的细节。但是,如果你要突破双精度的极限,那就没什么帮助了。因为你要处理的数字精确到许多有效数字,而且你需要精确地表示以10为基数的数字(没有转换到以2为基数所增加的变化),使用<代码>十进制>代码>而不是<代码>双可能是更好的:在此上下文中可能不相关,但也要考虑在浮点号上的ToStin为当前的文化插入小数分隔符,而不是所有的文化都使用。分隔小数部分。例如,在我的机器上,您的代码在拆分调用时失败。因为只有一个逗号可以分开。请注意,float和double的精度限制并不是硬限制——例如,根据您试图表示的确切数字,float的精度大约在6到9位之间。而true陈述了它与问题的关系-“一个点后有多少十进制数字?”"... 也就是说,可以为1.234567e10编写一些好的单词-它在点或零后是否有6个数字…@zer0填充此答案有一些问题。首先,它假设点是分隔符,情况并非总是如此,然后它不处理没有小数的数字。第三,仅使用一个字符串参数拆分在NetFramework(在core或net5中工作)上不起作用。如果您尝试您的示例,结果将是17
num
不是双精度而是十进制