2010-09-16 63 views
3

我试图得到以下double值中的数字位数:56.46855976而不使用将其转换为字符串(并简单地用“”替换“。”)。你怎么能得到一个双精度数字的位数?

有人有什么想法吗?

+0

噢胡说,什么是错的:'双d = 56.46855976; int length = d.ToString()。Replace(“。”,“”).Length;' – slugster 2010-09-16 11:50:46

+4

还要考虑到你看到的数字(56.46855976)只是一个值的*表示*。值1/3非常短,数字0.33333 ...不是。因此,除了查看问题,数字的长度信息不多。 – 2010-09-16 11:54:06

+0

[c#十进制字符串为货币]可能重复(https://stackoverflow.com/questions/10437416/c-sharp-decimal-to-string-for-currency) – TylerH 2018-02-16 16:59:44

回答

0

转换为字符串可能是您拥有的最佳选择。请记住double在内部表示为基本2。因此,您看到的十进制表示法只是实际存储值的近似值(整数除以2 ),这是个别幂数的和。

所以试图找出小数位数从二进制表示当然不是一件容易或无关紧要的任务 - 尤其是因为该框架也可能适用四舍五入使像3.999999999998这样的数字看起来像4.0,因为它们看起来比实际上更精确。

5

计算你需要多长时间将数字除以10,直到它小于1 - >该数字在小数点之前给出数字。

然后计算您必须多长时间将原始数字乘以10,直到它等于Math.Floor-result - >,该数字会给出小数点后面的数字。

Add。乐于。

编辑:正如乔伊所指出的那样,它存在一些不统一性。事先定义最大数字位数,这样您就不会创建无限循环。 在另一方面 - “多久是丹麦的海岸?” ......

1
/// Returns how many digits there are to the left of the . 
    public static int CountDigits(double num) { 
     int digits = 0; 
     while (num >= 1) { 
      digits++; 
      num /= 10; 
     } 
     return digits; 
    } 

正如马丁所说,计数到的权利。是毫无意义的。

测试:

MathPlus.CountDigits(56.46855976)     -> 2 
MathPlus.CountDigits((double)long.MaxValue + 1) -> 19 
MathPlus.CountDigits(double.MaxValue)    -> 309 
相关问题