我正在尝试获取以下双精度值中的位数: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,因为它们看起来比实际的精度更高.