Por que quando informo 3.0 ou 6.0, ele me forneça quebrado?

package aula1pratica5;

public class Principal {

public static void main(String[] args) {

    Vendas c1 = new Vendas();
    System.out.println("**********************");
    System.out.println("Informacoes da Nota");
    System.out.println("**********************");
    c1.nomeCliente = "Bastiao";
    c1.nomeVendedor = "Serafin";
    c1.produtoVenda = "sabonete";
    c1.valorVenda = 3.00;
    System.out.println("Nome do Cliente: " + c1.nomeCliente + "\nNome Vendedor: " + c1.nomeVendedor + "\nProduto Comprado: " + c1.produtoVenda);
    System.out.println("Valor Total: " +c1.comissao());
}

}
package aula1pratica5;

public class Vendas
{
String nomeVendedor;
double valorVenda;
String nomeCliente;
String produtoVenda;

double comissao() 
{
  valorVenda=valorVenda*0.20;
  return valorVenda;

}

}Texto pré-formatado

O que é esse valor quebrado que você diz? pode explicar melhor? qual o retorno que você espera?

A pergunta do @Jonathan_Medeiros ainda é válida, mas eu acredito que o seu cálculo 3.00 * 0.20 deveria dar um resultado 0.60 e talvez esteja dando algo do tipo 0.6000000000000001… confere?

Isso ocorre porque no java cálculos com números decimais sofrem de perda de precisão. Eu nunca entendi detalhes do porque isso ocorre, todavia se você está trabalhando com números decimais, pode usar o tipo BigDecimal… Sim, é uma merda e uma das coisas que mais odeio na linguagem, podiam mesmo trabalhar em cima disso.

Desculpe se entendi errado, estou sem poder testar a operação, mas se bem me lembro é isso que ocorre.

1 curtida

Exatamente isso que ocorreu aqui, ai eu tentei usar o printf ele deu erros, mas como que eu concerto isso ai ?digo usando printf

Exemplo do que eu acho que funciona

BigDecimal dec = new BigDecimal(3.00);

System.out.println(dec.multiply(new BigDecimal(0.20).setScale(2, RoundingMode.HALF_DOWN)));

Porém teste aí, realmente acho que o código acima funciona

OBS: Tem que importar a classe BigDecimal e RoundingMode, acho que ambas são do pacote java.math

1 curtida

Entendi, não conhecia, aposto que nem minha professora sabe o que é kkkk, mas valeu ai pela dica , estou pensando aqui como eu posso usar o printf com duas casas decimais.

Mais um detalhe que você pode testar também, acho que se o BigDecimal for criado com o parâmetro String no construtor, não precisa nem fazer o setScale() :wink:

Mas é apenas um chute também, não tenho como testar agora… :frowning:

Consegui uma forma de testar… :wink:

Segue: https://repl.it/@adriano3/java-tests

1 curtida

Obrigado ai , sempre aprendendo, será que a professora sabe ?kkkk, tudo tem que ser do jeito dela, affs, mas eu aprendi mais esta, obrigado ai , vou até salvar aqui.Muito Legal.

Massa… Relaxa que facul é assim mesmo… :wink:

1 curtida

Eu reprovei nesta disciplina, bicha chata, da outra vez ela me acusou o trabalho de plágio, sempre que eu fiz o trabalho com ajuda neste fórum aqui e no Facebook, ninguém faz trabalho para ninguém não , eu tirei 9,0 pontos, só que ai eu esqueci pois eu fui fazer estrutura de dados 2 , que graças a Deus eu passei nela também

   public double roundD(double value, int dec) {        
        long factor = (long) Math.pow(10, dec);
        value = value * factor;
        long tmp = Math.round(value);
        return (double) tmp / factor;
    }
1 curtida