Двойной является значением с плавающей точкой.Это подразумевает, что оно никогда не имеет точного значения.Любая плавающая точка имеет некоторую точность, толерантность или ошибку.
Другими словами, плавающая точка всегда является лишь приблизительной.Апроксимация может достичь точного значения, как и любой апроксимарион может , но все еще остается приблизительной.
Это имеет важные последствия: вы не можете просто кормить двойные числа в формулеученый.Попытка так приводит в общем к непригодным ненадежным / неправильным результатамВместо этого вы должны найти формулу замены, которая учитывает, что она является приблизительной.Например, деление и корни стабилизируются, различия значений разных размеров приводят к ошибкам и требуют масштабирования ...
Имея это в виду, вы получите 3.0385284430220667E18 в качестве приблизительного значения 3038528443022066688 - что является допустимым приближением.
Это произошло, когда вы сказали Java создать двойное число (обычное: приблизительное) из вашего длинного (которое было «дискретным» числом, и исчисление должно принимать это во внимание: дискретная математика или как Кнут называет это «конкретным»).