Основно кодиране на 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