Как исправить ошибку в вашей базе данных
Чтобы исправить ошибку в вашей базе данных, вы можете сделать следующее дополнение ко всем ошибочным данным:
long new_result = old_buggy_result + 1309965025280L;
Постоянное число было найдено так:
- Проверить багги
result
значение
- Найдите, какое должно быть правильное значение
result
?
- Сделайте дополнение к ошибочному значению
result
, чтобы найти правильный `результат.
Но это возможно только в том случае, если вы сохранили sample
и offset
в своей базе данных или в другом месте.
В противном случае, это зависит от количества оберток, которые произошли во время первоначального расчета:
long size_of_int = (long)Math.pow(2, 32);
int number_of_wraps = 305 // Only correct in your example!
// You can't deduct the number of wraps from
// the wrong value alone, because that information
// is lost in the modulo (the "wrap")
long correct_number = wrong_number + size_of_int * number_of_wraps;
Если числа в вашей базе данных достаточно близки к вашему значению выборки, это означает, что вы можете сделать выше, используя 305 в качестве числа переносов.
Объяснение ошибки (для будущих читателей)
Операция здесь:
(sample + offset) * 1000;
вычисляется с использованием int
, а не long
. Но результат «слишком велик» для сохранения в переменной int
. Вот почему у вас переполнение.
Измените его на:
((long) sample + offset) * 1000L;
Так что теперь операции +
и *
будут выполняться с использованием значений long
, и в результате будет значение long
, которое не будет переполнено.