У меня проблема с делением длинного значения на 1000 и округлением до целого числа.
Мое длинное значение: 1313179440000
Мой код
long modificationtime = 1313179440000;
Math.round(modificationtime/1000l)
Если я распечатаю разделенное и отформатированное значение, оно вернет мне: 1313179392
Так.
value : 1313179440000
expected: 1313179440
got : 1313179392
Не знаю, почему так происходит. Кто-нибудь может мне помочь?
С уважением, прдатур
2 ответа
Math.round(float)
уже используется. Число с плавающей запятой имеет больший диапазон , чем long, но оно не может представлять все целые числа в этом диапазоне - в данном случае целое число 1313179440 ( исходный результат деления) лежит в части диапазона, превышающей целочисленную точность.
Не используйте
Math.round
, поскольку он не нужен (ввод уже целое число!), Или;Используйте
Math.round(double)
, например:Math.round(modificationTime/1000d)
. Обратите внимание, что делитель является двойным, и поэтому делимое (и результат) выражения также увеличиваются до удвоения.
Удачного кодирования.
Причина, по которой вы получаете такой результат, заключается в том, что Math.Round()
принимает либо double
. Поскольку ваш номер не может быть точно представлен как double
, передается ближайший номер, который является .
Обратите внимание, что round()
здесь совершенно не нужен. modificationTime/1000l
не требует округления. Если вам действительно требуется округление, измените аргумент на modificationTime/1000d
.
Похожие вопросы
Новые вопросы
java
Java - это язык программирования высокого уровня. Используйте этот тег, если у вас возникли проблемы с использованием или пониманием самого языка. Этот тег редко используется отдельно и чаще всего используется вместе с [spring], [spring-boot], [jakarta-ee], [android], [javafx], [hadoop], [gradle] и [maven].