Modulo with Double 查找数字的数字有什么问题?
What is wrong with Modulo with Double to find the digits of a number?
我正在尝试查找 int 无法保存的 long double 中的位数。它获取用户输入的数字并找到它的数字并将其放入一个 int 数组中。对于较小的数字(例如 <10^10),它似乎工作得很好,但当它接近较大的数字时,最后几位数字似乎已关闭。
请看一下我的功能:
static void insertDigits(int[] digits, double number) {
double num=number;
int counter=digits(number)-1;
while(counter>=0) {
digits[counter]=(int) (num%10);
num=Math.floor(num/10);
counter=counter-1;
}
}
当我输入 13256709 时,我得到(好):
1.3256709E7 1
1.3256709E7 3
1.3256709E7 2
1.3256709E7 5
1.3256709E7 6
1.3256709E7 7
1.3256709E7 0
1.3256709E7 9
但是当我输入一个长数字如 25768437216701562 时,我得到:
2.576843721670156E16 2
2.576843721670156E16 5
2.576843721670156E16 7
2.576843721670156E16 6
2.576843721670156E16 8
2.576843721670156E16 4
2.576843721670156E16 3
2.576843721670156E16 7
2.576843721670156E16 2
2.576843721670156E16 1
2.576843721670156E16 6
2.576843721670156E16 7
2.576843721670156E16 0
2.576843721670156E16 1
2.576843721670156E16 5
2.576843721670156E16 6
2.576843721670156E16 0
如您所见,最后一位数字已关闭。如果部分代码存在其他问题,我们很乐意根据需要发送更多代码。我觉得这与模运算符对双打很时髦有关。感谢您的帮助!
您的方法不适用于 double
,因为累积的舍入误差会使您少一些数字。要在不损失精度的情况下转换双精度数,您必须专门使用整数运算。即使用 Double.doubleToRawLongBits(d)
并使用 IEEE-754 格式从那里开始工作。
But when I input a long number such as 25768437216701562, I get: 2.576843721670156E16
这是因为 2.576843721670156E16 是最接近的可表示值,下一个值是 2.5768437216701564E16
您可以通过以下代码看到这一点,它采用 64 位浮点数,就好像它是 64 位长。
System.out.println(Double.doubleToRawLongBits(25768437216701560.0));
System.out.println(Double.doubleToRawLongBits(25768437216701564.0));
打印
4852315308354829086
4852315308354829087
就像这两个long值之间没有long表示一样,它们之间也没有double表示。
我正在尝试查找 int 无法保存的 long double 中的位数。它获取用户输入的数字并找到它的数字并将其放入一个 int 数组中。对于较小的数字(例如 <10^10),它似乎工作得很好,但当它接近较大的数字时,最后几位数字似乎已关闭。
请看一下我的功能:
static void insertDigits(int[] digits, double number) {
double num=number;
int counter=digits(number)-1;
while(counter>=0) {
digits[counter]=(int) (num%10);
num=Math.floor(num/10);
counter=counter-1;
}
}
当我输入 13256709 时,我得到(好): 1.3256709E7 1 1.3256709E7 3 1.3256709E7 2 1.3256709E7 5 1.3256709E7 6 1.3256709E7 7 1.3256709E7 0 1.3256709E7 9 但是当我输入一个长数字如 25768437216701562 时,我得到: 2.576843721670156E16 2 2.576843721670156E16 5 2.576843721670156E16 7 2.576843721670156E16 6 2.576843721670156E16 8 2.576843721670156E16 4 2.576843721670156E16 3 2.576843721670156E16 7 2.576843721670156E16 2 2.576843721670156E16 1 2.576843721670156E16 6 2.576843721670156E16 7 2.576843721670156E16 0 2.576843721670156E16 1 2.576843721670156E16 5 2.576843721670156E16 6 2.576843721670156E16 0 如您所见,最后一位数字已关闭。如果部分代码存在其他问题,我们很乐意根据需要发送更多代码。我觉得这与模运算符对双打很时髦有关。感谢您的帮助!
您的方法不适用于 double
,因为累积的舍入误差会使您少一些数字。要在不损失精度的情况下转换双精度数,您必须专门使用整数运算。即使用 Double.doubleToRawLongBits(d)
并使用 IEEE-754 格式从那里开始工作。
But when I input a long number such as 25768437216701562, I get: 2.576843721670156E16
这是因为 2.576843721670156E16 是最接近的可表示值,下一个值是 2.5768437216701564E16
您可以通过以下代码看到这一点,它采用 64 位浮点数,就好像它是 64 位长。
System.out.println(Double.doubleToRawLongBits(25768437216701560.0));
System.out.println(Double.doubleToRawLongBits(25768437216701564.0));
打印
4852315308354829086
4852315308354829087
就像这两个long值之间没有long表示一样,它们之间也没有double表示。