查找Double的小数点后的位数

我有一个Double值:

double a = 4.5565; 

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

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

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

编辑

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

 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)的整数部分来计算小数点左边的位数。 它最适用于小数,因为它们具有更好的值精度,因此舍入误差更小。

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

写一个函数

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

如果需要,我也许可以使用这段代码,

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

这里的"R"是Round Trip Format Specifier

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

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

  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

STSdb论坛中有一篇非常好的文章: 小数点后的位数。 它总结了许多已知的实现–ToString(),10方法的权力和其他更高级的方法。 提供了比较测试,显示哪种方法最快。 提供的解决方案适用于双精度和十进制类型。