Базовое кодирование JAVA. Почему 100/1=110, как 300/3, 400/4, 500/5?

Мне нужна помощь, чтобы понять, что произошло. Я говорю по-итальянски, поэтому я назвал переменную по-итальянски. После некоторого времени без кодирования я начал кодировать что-то простое и простое. Я сделал класс под названием «Prova», который был калькулятором. 4 метода: сложение, минус, произведение и деление. Первые три метода не имели аномалии, последний имел. Я сделал работающий класс и увидел какой-то странный результат

Вот код:

    public class Prova {
    public int add(int addendo1, int addendo2) {
       int res;
       res = addendo1+addendo2;
       return res;
    }
    public int minus(int minuendo, int sottraendo) {
       int res;
       res = minuendo-sottraendo;
       return res;
    }
    public int multiply(int fattore1, int fattore2) {
       int res;
       res = fattore1*fattore2;
       return res;
    }
    public double divide(int divisore, int dividendo) {
       double res;
       res = divisore/dividendo;
       return res;
    }`

Вот команда: public static void main(String[] args) {

    Prova somma = new Prova();
    System.out.println(somma.add(5, 5)+"\n");
    System.out.println(differenza.minus(20, 11)+"\n");
    System.out.println(new Prova().product(2, 4)+"\n\n");
    System.out.println(new Prova().divide(100, 1)+'\n');
    System.out.println(new Prova().divide(100, 2)+'\n');
    System.out.println(new Prova().divide(300, 3)+'\n');
    System.out.println(new Prova().divide(400, 4)+'\n');
    System.out.println(new Prova().divide(500, 5)+'\n');
    System.out.println(new Prova().divide(600, 6)+'\n');
}

И вот мои результаты:

- 10        //somma.add(5,5) 
- 9         //differenza.minus(20,11)
- 8         //multiply(2,4) 
- 110.0     //divide(100,1)
- 60.0      //divide(100,2)
- 110.0     //divide(300,3)
- 110.0     //divide(400,4)
- 110.0     //divide(500,5)
- 110.0     //divide(600,6)

Другие попытки с методом разделения дали

14/2 = 17.0;
1/1 = 11.0;
2/2 = 11.0;
3/3 = 11.0;

Оператор отлично работает за пределами моего класса Prova.divide(). Мой вопрос, что здесь произошло? Я не вижу, что я сделал неправильно


person Kyo    schedule 06.12.2018    source источник
comment
Целочисленная математика. Изменить res = divisore/dividendo; на res = divisore/(double)dividendo;   -  person Elliott Frisch    schedule 06.12.2018
comment
Поскольку оба эти divisore/dividendo являются целыми числами, вы будете выполнять целочисленное деление   -  person Scary Wombat    schedule 06.12.2018
comment
По сути, вы пытаетесь соединить символ новой строки \n с double, но фактически добавляете 10, поскольку (int) '\n' равно 10. Вместо этого вы можете использовать "\n", чтобы фактически объединить символ новой строки. Я собирался опубликовать его как ответ, но он был помечен как дубликат.   -  person Jacob G.    schedule 06.12.2018


Ответы (1)


Я могу сказать, что вы хотите соединить символ новой строки ('\n') с вашим результатом. Поскольку вы возвращаете свой результат как double, вы не можете просто добавить '\n' к результату, так как он будет использовать соответствующее значение int (10). Это показывает, почему вы получаете 110, когда делите 100 на 1, а затем прибавляете '\n'.

Чтобы исправить это, я бы изменил '\n' на "\n", чтобы ваш результат сначала был приведен к String.

Кроме того, если вы решите разделить что-либо, результатом которого является дробь, вы столкнетесь с неожиданным целочисленным делением. См.: Почему результат 1/3 == 0?

Примечание. Поскольку вы используете System.out.println, в любом случае нет необходимости добавлять символы новой строки!

person Jacob G.    schedule 06.12.2018
comment
Очень хорошо замечено; но одно дополнительное предложение. Предпочитайте System.lineSeparator() вместо "\n" (или используйте printf и %n). - person Elliott Frisch; 06.12.2018