Почему Kotlin toIntOrNull() возвращает null для больших чисел?

#android-studio #kotlin

#android-studio #kotlin

Вопрос:

У меня есть следующий код, чтобы проверить, равно ли значение Int or null , и дополнительно проверить, находится ли оно ниже определенного числа:

             binding.RootLayout.forEach {
                if (it is EditText) {

                    val intOrNull = it.text.toString().toIntOrNull()

                    if (intOrNull == null) {

                        count  = 1
                    } else if (intOrNull > 100000) {
                        overTheLimitExist = true
                    }
                }
            }
 

Проблема в том, что когда я ввожу какое-то число, подобное 123456789 или ниже, оно правильно идентифицирует его как (1) Int и (2) выше заданного предела. Однако, если я введу большее число, например, 12345678900 оно неправильно идентифицирует его как null .

Я ищу в Интернете toIntOrNull , но они ничего не сказали об ограничении функции.

Комментарии:

1. Максимальный предел Int составляет приблизительно 2*10^9 (4 байта). Над этим до 4*10^18 тех пор, пока не будет использовано приблизительно Long (8 байт). Или еще BigInteger что может хранить число до бесконечности: P (просто шучу, он может хранить до ~ 18 ГБ оперативной памяти).

Ответ №1:

12345678900 больше максимального значения Integer (2 ^ 31-1) , следовательно, реализация toIntOrNull возвращает null, поскольку 12345678900 не помещается в 4 байта.

Вы можете использовать toLongOrNull или toBigIntegerOrNull для действительно больших чисел.

Комментарии:

1. Спасибо, я не знал об этом. Есть ли снижение производительности toLongOrNull ?

2. никакого влияния на производительность, хотя long занимает 8 байт памяти

3. Спасибо, я все равно не сохраняю значение. Я просто выполняю преобразование.

Ответ №2:

Я думаю, что эта проблема связана с ограничением типа int
(От -2 147 483 648 до 2 147 483 647) вам следует использовать другой тип, такой как "Long" или BigNumber java class. 
вы можете протестировать на 1 больше этого диапазона (2147483648) или на 1 меньше (2147483646) и посмотреть результат.
Я надеюсь, что это поможет вам. 
извините за мой английский.