Несоответствие при делении длинных значений в Java - PullRequest
0 голосов
/ 15 февраля 2019

Я знаю, что это покажется безумным, я почесал голову над этим прямо сейчас и почти уверен, что что-то упускаю.

Я вычисляю 'countOfMinutes', которые произошли с того моментадня по сравнению с текущим временем.Для этого я делаю следующее:

    long startTime = System.currentTimeMillis();
    // Below mod function gets code to start of the day
    long lastStart = startTime - (startTime % (TimeUnit.DAYS.toMillis(1)));

    long now = System.currentTimeMillis();
    long minuteInMs = TimeUnit.MINUTES.toMillis(1);
    countOfMinutes = (now - lastStart) / minuteInMs;

Это фрагмент кода, который у меня работает 24/7 и периодически перезапускается.У меня есть журналы из выходных данных, где я записываю значение «lastStart», «сейчас» и «countOfMinutes».Я использовал те же значения на моей локальной машине, и я получил ожидаемые значения.Но, глядя на журналы, те же самые значения приводят к 0. Я не могу понять, почему одни и те же числа приводят к различным значениям.

Вот журналы, которые у меня есть из работающей системы:

18:21:53.908 INFO  [Thread-3] Adjusted start time= 1550102400000\n
18:21:53.908 INFO  [Thread-3] Current time= 1550168520001\n
18:21:53.908 INFO  [Thread-3] countOfMinutes based on start time= 0\n

Итак, я взял эти значения, побежал локально и получил то, что ожидал:

14:52:17.037 [main] INFO  The difference is:66120001
14:52:17.041 [main] INFO  value of countOfMinutes:1102

Я думал о чем-то с переполнением, но просто не уверен, насколько это возможно, это может произойти, некоторые извремя.Я не подозреваю, что журналы могут быть испорчены подобным образом, и метод toString () long показывает одно, а фактически другое.

Отредактировано: обновление с использованием действующего кода ПРИМЕЧАНИЕ. В реальном коде уже есть вещи, которые я идентифицирую, которые должныбыть обновленным.например, регистрация lastStart вместо startTime, если это то, что я собираюсь использовать в вычислениях, сохранение сейчас и последующее ведение журнала сейчас, а не вызов System.currentTime несколько раз, и другие.Я предполагаю, что с несоответствием в том, что регистрируется, и фактическими значениями переменных (которые мы не знаем), это может привести к этому, но кажется странным, что так и будет.Ниже код:

    long startTime = System.currentTimeMillis();
    long lastStart = startTime - (startTime % (TimeUnit.DAYS.toMillis(1)));
    startTime = lastStart;

    logger.info("Adjusted start time= {}", startTime); // Adjust start time to start of the day

    long minuteInMs = TimeUnit.MINUTES.toMillis(1);
    logger.info("Current time= {}", System.currentTimeMillis());

    long now = System.currentTimeMillis();
    long countOfMinutes = (now - lastStart) / minuteInMs;

    logger.info("countOfMinutes based on start time= {}", countOfMinutes);
...