3/2: парадокс деления (Ява) - PullRequest
       45

3/2: парадокс деления (Ява)

0 голосов
/ 02 ноября 2019

Я только что написал это, и я не могу найти причину, по которой это не решит деление, как ожидалось. Может кто-нибудь объяснить, что здесь происходит?

Вот код:

/*
3/2
 */
package paradoja;

public class Paradoja {

    public static void main(String[] args) {
        float dividendo, divisor, resto, cociente;

        dividendo = 3;
        divisor = 2;
        resto = dividendo % divisor;
        cociente = dividendo / divisor;

        System.out.printf("--------DIVISION--------\n");
        System.out.printf("El propósito es dividir 3 entre 2 y, a continuación, hacer la prueba.\n------------------------\n");
        System.out.printf("Dividendo = %.2f\nDivisor = %.2f\nCociente = %.2f\nResto = %.2f\n", dividendo, divisor, cociente, resto);
        System.out.printf("--------PRUEBA--------\n");
        System.out.printf("%.2f * %.2f + %.2f = %.2f (¿?)\n----------------------\n", cociente, divisor, resto, cociente * divisor + resto);
    }

}

Это всего лишь деление на 3/2 и дальнейшее тестирование. Возвращает 4 вместо 3. Спасибо за ваше время!

Ответы [ 2 ]

1 голос
/ 02 ноября 2019

Я прокомментировал значения ваших переменных в каждой точке программы.

package paradoja;

public class Paradoja {

    public static void main(String[] args) {
        float dividendo, divisor, resto, cociente;

        dividendo = 3;
        divisor = 2;
        resto = dividendo % divisor;     // resto = 3.0 % 2.0 = 1.0
        cociente = dividendo / divisor;  // cociente = 3.0 / 2.0 = 1.5

        System.out.printf("--------DIVISION--------\n");
        System.out.printf("El propósito es dividir 3 entre 2 y, a continuación, hacer la prueba.\n------------------------\n");
        System.out.printf("Dividendo = %.2f\nDivisor = %.2f\nCociente = %.2f\nResto = %.2f\n", dividendo, divisor, cociente, resto);
        System.out.printf("--------PRUEBA--------\n");
        // The last parameter passed to the System.out.printf() statement is cociente * divisor + resto = 1.5 * 2.0 + 1.0 = 4.0
        System.out.printf("%.2f * %.2f + %.2f = %.2f (¿?)\n----------------------\n", cociente, divisor, resto, cociente * divisor + resto);
    }

}
0 голосов
/ 02 ноября 2019

Хорошо. resto = остаток от целочисленного деления - 3% 2 = 1.

Но вы не делите целочисленное деление. Вы делаете деление с плавающей запятой. Итак, ваш последний расчет:

cociente * divisor + resto
1.5 * 2 + 1 = 4

Если вы храните все это в целых числах, а не в числах с плавающей запятой, он будет делать то, что вы ожидаете. Или, если в окончательном расчете вы конвертировали в целые числа, все будет работать так, как вы ожидаете.

...