Math.round / Разделить проблему с длинным значением - PullRequest
4 голосов
/ 26 августа 2011

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

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

Мой код

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

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

так.

value   : 1313179440000
expected: 1313179440
got     : 1313179392

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

С наилучшими пожеланиями, prdatur

Ответы [ 2 ]

10 голосов
/ 26 августа 2011

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

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

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

Счастливое кодирование.

3 голосов
/ 26 августа 2011

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

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

...