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 格式从那里开始工作。

这是我之前写的例子。 https://github.com/OpenHFT/Chronicle-Bytes/blob/master/src/main/java/net/openhft/chronicle/bytes/BytesInternal.java#L1513

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表示。