查找Double的小数点后的位数

时间:2012-02-21 22:58:36

标签: c#

我有一个Double值:

double a = 4.5565;

计算小数点后位数的最简单方法是什么(本例中为4)。

我知道我可以转换为字符串并进行拆分并获取长度。但是有更简单的方法吗?

8 个答案:

答案 0 :(得分:19)

没有简单的方法,特别是因为数学上的数字位数可能远远超过显示数字。例如,4.5565实际上存储为4.556499999999999772626324556767940521240234375(感谢harold计算)。你不太可能找到解决这个问题的有用方法。

修改

可以提出一些算法,如下所示:如果,当你计算十进制表示时,你会连续找到一定数量的9(或零),你就会向上舍入(或者在一系列9s(或零)开始之前的最后一个位置。我怀疑你会发现这条道路比你预期的更麻烦。

答案 1 :(得分:12)

var precision = 0;
var x = 1.345678901m;

while (x*(decimal)Math.Pow(10,precision) != 
         Math.Round(x*(decimal)Math.Pow(10,precision))) 
   precision++;

precision将等于十进制值的有效位数(设置x到1.23456000将导致精度为5,即使最初在文字中指定了8位数)。这与小数位数成比例地执行。它仅计算小数位数;你可以通过取Math.Log10(x)的整数部分来计算小数点左边的位数。它最适用于小数,因为它们具有更好的值精度,因此舍入误差更小。

答案 2 :(得分:4)

写一个函数

int CountDigitsAfterDecimal(double value)
        {
            bool start = false;
            int count = 0;
            foreach (var s in value.ToString())
            {
                if (s == '.')
                {
                    start = true;
                }
                else if (start)
                {
                    count++;
                }
            }

            return count;
        }

答案 3 :(得分:3)

我认为String解决方案最好:((a-(int)a)+"").length-2

答案 4 :(得分:1)

我认为这可能是一个解决方案:

 private static int getDecimalCount(double val)
 {
     int i=0;
     while (Math.Round(val, i) != val)
         i++;
     return i;
 }

double val9 = 4.5565d; int count9 = getDecimalCount(val9);//result: 4

抱歉重复 - > https://stackoverflow.com/a/35238462/1266873

答案 5 :(得分:1)

基于詹姆斯的答案更加清楚:

int num = dValue.ToString().Length - (((int)dValue).ToString().Length + 1);

num是小数点后的确切位数。 不包括0(25.52 0000 ) 在这种情况下,您将获得num = 2

答案 6 :(得分:0)

我可能会在需要时使用此代码,

myDoubleNumber.ToString("R").Split('.')[1].Length

"R"这里是Round Trip Format Specifier

我们首先需要检查索引边界。

答案 7 :(得分:0)

另一种解决方案是使用一些字符串函数:

private int GetSignificantDecimalPlaces(decimal number, bool trimTrailingZeros = true)
{
  string stemp = Convert.ToString(number);

  if (trimTrailingZeros)
    stemp = stemp.TrimEnd('0');

  return stemp.Length - 1 - stemp.IndexOf(
     Application.CurrentCulture.NumberFormat.NumberDecimalSeparator);
}

记住要使用System.Windows.Forms来访问Application.CurrentCulture