如何获得双精度数中包含的位数?
我正在尝试获取以下double值中的位数:56.46855976而不使用将其转换为字符串(并简单地将“。”替换为“”)。
有人有任何想法吗?
计算你必须将数字除以10的频率,直到它小于1 – >,它给出了小数点前的数字。
然后计算你必须将原始数字乘以10的频率,直到它等于Math.Floor-result – >,它给出了小数点后面的数字。
加。 乐于。
编辑 :正如乔伊指出的那样,它有一些不确定性。 事先定义最大位数,这样就不会创建无限循环。 另一方面 – “丹麦海岸有多长?”……
/// 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
转换为字符串可能是您拥有的最佳选择。 请记住, double
s在Base 2内部表示。 因此,您看到的十进制表示只是实际存储值的近似值(除了最大值为2 53的整数),它是2的单个幂的总和。
所以试图从二进制表示中找出十进制数字当然不是一件容易或琐碎的事情 – 特别是因为框架也可能应用舍入来使像3.999999999998这样的数字看起来像4.0,因为它们看起来比实际更精确。