Operador ternário

Pessoal,

No algoritmo abaixo, o valor da alíquota retorna sempre 0. Qual o motivo?

Outra coisa, por que tenho que colocar o cast (float) na frente do código destacado abaixo. Se eu não colocar, não compila. A dúvida disso é que a variável alíquota já foi declarada como float. Então não entendo essa exigência. Eu tenho que fazer utilizando operador ternário “?”, “:”. Muito obrigado.

import java.util.Scanner;

public class C0610Exercicio06 {

public static void main (String[] args) {

  Scanner ler = new Scanner (System.in);
  float salario, aliquota;
  
  System.out.print("Informe o salário: ");
  salario = ler.nextFloat();

> aliquota = (float) (salario >= 1434 ? 0 : salario >= 2150 ? 7.5 : salario >= 2886 ? 15 : salario >= 3582 ? 22.5 : 27.5);

  System.out.println("- Alíquota: " + aliquota);
  System.out.println("- Imposto devido: " + (salario * aliquota)/100);

}
}

Você quer que a alíquota seja zero somente quando o valor for menor ou igual a 1434, não maior ou igual como está no seu código. Inverta seus operadores:

aliquota = (float) (salario <= 1434 ? 0 : salario <= 2150 ? 7.5 : salario <= 2886 ? 15 : salario <= 3582 ? 22.5 : 27.5);

Você precisa fazer o cast no começo porque, na ausência de um especificador, um número de ponto flutuante é do tipo double, não float. Pode manter assim ou adicionar o especificador f, como abaixo:

aliquota = salario <= 1434 ? 0f : salario <= 2150 ? 7.5f : salario <= 2886 ? 15f : salario <= 3582 ? 22.5f : 27.5f);

Abraço.

1 curtida

É que você está digitando um valor maior ou igual que 1434 e sua lógica diz que se for maior ou igual a 1434 a alíquota será 0.

Quando você digita literais decimais, o Java implicitamente assume que são do tipo double. Você pode colocar o sufixo F após o literal, aí o compilador tratará o valor como float, não precisando do cast.
Exemplo:
aliquota = salario >= 1434 ? 0.0F : salario >= 2150 ? 7.5F : salario >= 2886 ? 15.0F : salario >= 3582 ? 22.5F : 27.5F;

Tenha em mente que este é somente um exercício e no mundo real você não deveria escrever tantos ternários aninhados pois isso dificulta a legibilidade, ainda mais escrevendo numa única linha.

Seu código poderia ser indentado assim:

aliquota = salario >= 1434 ? 0.0F
                           : salario >= 2150 ? 7.5F
                                             : salario >= 2886 ? 15F
                                                               : salario >= 3582 ? 22.5F
                                                                                 : 27.5F;

Ou assim:

aliquota = salario >= 1434
                    ? 0.0F
                    : salario >= 2150
                               ? 7.5F
                               : salario >= 2886
                                          ? 15F
                                          : salario >= 3582
                                                     ? 22.5F
                                                     : 27.5F;

Mas mesmo assim fica algo feio de se ler.
Na prática se costuma utilizar o operador ternário somente em expressões com uma condição.
Com duas ou mais condições, fica mais legível escrever o algoritmo em um método utilizando if, dessa forma::

float getAliquota(float salario) {
    if (salario >= 1434) {
        return 0.0F;
    }
    if (salario >= 2150) {
        return 7.5F;
    }
    if (salario >= 2886) {
        return 15.0F;
    }
    if (salario >= 3582) {
        return 22.5F;
    }
    return 27.5F;
}
1 curtida

Muito obrigado :slight_smile:

Nunca, em hipótese alguma, faça um ternário desse tamanho.

1 curtida

O exercício exigia que a gente esgotasse a cabeça fazendo com operador ternário. Sei que não é melhor prática

1 curtida