Страницы

Поиск по вопросам

Показаны сообщения с ярлыком biginteger. Показать все сообщения
Показаны сообщения с ярлыком biginteger. Показать все сообщения

пятница, 13 марта 2020 г.

NumberFormatException при вызове Integer.parseInt() не во всех случаях и при непустой валидной строке

#java #android #biginteger


Что за Exception выкидывает? 
Вот участок кода на который ругается.

  55  StringBuilder quotientStr = new StringBuilder();

  56  quotientStr.append(arrOfVar[2]);**//добавляем число из массива**
  57  quotientStr.append(5);
  58  int quotient = Integer.parseInt(quotientStr.toString());

Exception in thread "main" java.lang.NumberFormatException: For input string: "4090303030"
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:495)
    at java.lang.Integer.parseInt(Integer.java:527)
    at TaskTwo.division.LongDivision.intermCalc(LongDivision.java:58)

    


Ответы

Ответ 1



Проблема в том, что вы вышли за границы максимальнно возможного значения содержимого переменной типа int, кое равняется 2147483647, т.е. 2млрд+. А у вас 4млрд+. Таким образом, например, вы не можете поместить всё население нашей планеты в переменную int. А вот население Китая вполне поместится в такой переменной. И программа такая будет работать исправно ровно до тех пор, пока Китай не присоединит к себе Индию. Только представьте: вы играете в к-л игру за Китай, развязываете n-мировую войну, побеждаете и присоединяете к себе Индию... А вместо сообщения "Поздравляем, теперь коммунистов в мире 2млрд+!" ваша игра вылетает на рабочий стол! Ибо в такой игре захватить Индию невозможно безнаказанно) Решение: Для таких больших чисел надо использовать класс BigInteger, передавая вашу строку в его конструктор: BigInteger quotient = new BigInteger(quotientStr.toString()); System.out.println(quotient); //в вашем случае без проблем выведет 4090303030

вторник, 24 декабря 2019 г.

Расширение класса перегруженными операторами C#

#c_sharp #ооп #biginteger


Имеется класс BigInteger библиотеки BouncyCastle, который имеет функции вида BigInteger.Add(BigInteger),
Sub, Multiply и т.д. Так вот, для удобной работы хочется создать перегруженные методы
operator+, operator- и т.д, т.е. расширить данный класс. Как это можно сделать правильно
и по канонам ООП?

Для пользователя все должно выглядеть примерно так:  

BigInteger A=5,B=10;
BigInteger C = A+B;

    


Ответы

Ответ 1



Боюсь у вас ничего не получится. Дело в том, что интересующий вас синтаксис - обеспечивается перегрузкой операторов, и без возможности модифицировать исходники класса BigInteger вы эту задачу выполнить не сможете. Теоретически вам могла бы помочь такая возможность, как методы расширения (extension methods), но этот синтаксический сахар применим только по отношению к экземплярам, а перегрузка операторов реализуется статическими методами. Наследование тут вам тоже вряд ли поможет, во всяком случае для получения результата в том виде, в котором вы хотите. Вы, конечно, можете создать класс-наследник BigInteger, перегрузить в нём арифметические операторы с помощью соответствующих статических методов, но эти операторы будут работать только применимо к вашему классу-наследнику, то есть писать что-то вроде BigInteger A=5,B=10; BigInteger C = A+B; вы не сможете

воскресенье, 2 июня 2019 г.

NumberFormatException при вызове Integer.parseInt() не во всех случаях и при непустой валидной строке

Что за Exception выкидывает? Вот участок кода на который ругается.
55 StringBuilder quotientStr = new StringBuilder();
56 quotientStr.append(arrOfVar[2]);**//добавляем число из массива** 57 quotientStr.append(5); 58 int quotient = Integer.parseInt(quotientStr.toString());
Exception in thread "main" java.lang.NumberFormatException: For input string: "4090303030" at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65) at java.lang.Integer.parseInt(Integer.java:495) at java.lang.Integer.parseInt(Integer.java:527) at TaskTwo.division.LongDivision.intermCalc(LongDivision.java:58)


Ответ

Проблема в том, что вы вышли за границы максимальнно возможного значения содержимого переменной типа int, кое равняется 2147483647, т.е. 2млрд+. А у вас 4млрд+ Таким образом, например, вы не можете поместить всё население нашей планеты в переменную int. А вот население Китая вполне поместится в такой переменной. И программа такая будет работать исправно ровно до тех пор, пока Китай не присоединит к себе Индию. Только представьте: вы играете в к-л игру за Китай, развязываете n-мировую войну, побеждаете и присоединяете к себе Индию... А вместо сообщения "Поздравляем, теперь коммунистов в мире 2млрд+!" ваша игра вылетает на рабочий стол! Ибо в такой игре захватить Индию невозможно безнаказанно)
Решение:
Для таких больших чисел надо использовать класс BigInteger, передавая вашу строку в его конструктор:
BigInteger quotient = new BigInteger(quotientStr.toString()); System.out.println(quotient); //в вашем случае без проблем выведет 4090303030

понедельник, 26 ноября 2018 г.

Расширение класса перегруженными операторами C#

Имеется класс BigInteger библиотеки BouncyCastle, который имеет функции вида BigInteger.Add(BigInteger), Sub, Multiply и т.д. Так вот, для удобной работы хочется создать перегруженные методы operator+, operator- и т.д, т.е. расширить данный класс. Как это можно сделать правильно и по канонам ООП?
Для пользователя все должно выглядеть примерно так:
BigInteger A=5,B=10; BigInteger C = A+B;


Ответ

Боюсь у вас ничего не получится. Дело в том, что интересующий вас синтаксис - обеспечивается перегрузкой операторов, и без возможности модифицировать исходники класса BigInteger вы эту задачу выполнить не сможете. Теоретически вам могла бы помочь такая возможность, как методы расширения (extension methods), но этот синтаксический сахар применим только по отношению к экземплярам, а перегрузка операторов реализуется статическими методами. Наследование тут вам тоже вряд ли поможет, во всяком случае для получения результата в том виде, в котором вы хотите. Вы, конечно, можете создать класс-наследник BigInteger, перегрузить в нём арифметические операторы с помощью соответствующих статических методов, но эти операторы будут работать только применимо к вашему классу-наследнику, то есть писать что-то вроде
BigInteger A=5,B=10; BigInteger C = A+B;
вы не сможете