У меня проблема с делением длинного значения на 1000 и округлением до целого числа.

Мое длинное значение: 1313179440000

Мой код

long modificationtime = 1313179440000;
Math.round(modificationtime/1000l)

Если я распечатаю разделенное и отформатированное значение, оно вернет мне: 1313179392

Так.

value   : 1313179440000
expected: 1313179440
got     : 1313179392

Не знаю, почему так происходит. Кто-нибудь может мне помочь?

С уважением, прдатур

6
prdatur 26 Авг 2011 в 23:16

2 ответа

Лучший ответ

Math.round(float) уже используется. Число с плавающей запятой имеет больший диапазон , чем long, но оно не может представлять все целые числа в этом диапазоне - в данном случае целое число 1313179440 ( исходный результат деления) лежит в части диапазона, превышающей целочисленную точность.

  1. Не используйте Math.round, поскольку он не нужен (ввод уже целое число!), Или;

  2. Используйте Math.round(double), например: Math.round(modificationTime/1000d). Обратите внимание, что делитель является двойным, и поэтому делимое (и результат) выражения также увеличиваются до удвоения.

Удачного кодирования.

13
26 Авг 2011 в 19:34

Причина, по которой вы получаете такой результат, заключается в том, что Math.Round() принимает либо double. Поскольку ваш номер не может быть точно представлен как double, передается ближайший номер, который является .

Обратите внимание, что round() здесь совершенно не нужен. modificationTime/1000l не требует округления. Если вам действительно требуется округление, измените аргумент на modificationTime/1000d.

3
dlev 26 Авг 2011 в 19:23