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

12 respostas
java
N

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

12 Respostas

Jonathan_Medeiros

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

N

adriano_si

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.

N

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

adriano_si

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

N

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.

adriano_si

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:

adriano_si

Consegui uma forma de testar… :wink:

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

N

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.

adriano_si

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

N

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

j-menezes
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;
    }
Criado 20 de agosto de 2019
Ultima resposta 20 de ago. de 2019
Respostas 12
Participantes 4