Рассчитать годы в миллисах долго отрицательный ответ - PullRequest
0 голосов
/ 16 ноября 2018

Я пытаюсь конвертировать 14 лет в миллис, используя функцию

    fun getMinimumAgeInMillis(): Long {
        val long: Long = 1000 * 60 * 60 * 24 * 365 * 14
        return (long)
    }

Но вместо моего значения я получил отрицательное значение -877631488. Итак, где проблема? Я не бью длинные ограничения

1 Ответ

0 голосов
/ 16 ноября 2018

Если вы используете IDE, такую ​​как IntelliJ, это подсказывает вам проблему:

enter image description here

Будет переполнено, потому что типы не совпадают. Котлин строг в отношении типов, и это похоже на целочисленное деление, за исключением умножения.

1000 подразумевает целое число. Он будет автоматически делать это долго, но вы начнете с int. Связанные, помните, как 1 / 3! = 1f / 3f. Все, что вам нужно сделать, это явно объявить тип Once . Вы также можете сделать это для всех, но мне удалось исправить это с помощью одного.

Поэтому вместо текущего умножения используйте 1000L * 60 * 60 * 24 * 365 * 14. Обратите внимание на добавленный L, который преобразует один тип в Long. В противном случае они по умолчанию являются целыми числами, что приводит к переполнению, приведенному к типу Long.


Если вы используете IntelliJ или Android Studio, попробуйте удалить явный тип. Если у вас включены эти метки (не совсем уверены, как они называются, но это не относится к делу), вы увидите, что они показывают Int, а не Long:

enter image description here

Добавьте L к одному из них, и оно изменится на Long, как и ожидалось. Обратите внимание, что L необходимо добавить в начале умножения. Если вы добавите его в т. Е. 14, он переполнится, прежде чем преобразуется в целое число. Снова взяв 1 / 3 в качестве примера, 1f / 3f является одним из подходов, но 1 / 3f и 1f / 3 также допустимы. В основном, типы должны быть правильными, прежде чем произойдет «неправильная» операция.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...