查找Double的小数点后的位数

bli*_*egz 17 c#

我有一个Double值:

double a = 4.5565;
Run Code Online (Sandbox Code Playgroud)

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

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

pho*_*oog 19

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

编辑

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

  • 先前的评论不小心是32bit浮点数,应该是:4.5564999999999999999772626324556556767940521240234375 (2认同)

Kei*_*thS 14

var precision = 0;
var x = 1.345678901m;

while (x*(decimal)Math.Pow(10,precision) != 
         Math.Round(x*(decimal)Math.Pow(10,precision))) 
   precision++;
Run Code Online (Sandbox Code Playgroud)

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


小智 5

写一个函数

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;
        }
Run Code Online (Sandbox Code Playgroud)