Problemas com subtração de valores double

Fala pessoal, alguém poderia me ajudar com este problema? estou fazendo um sistema de frente de caixa, e na parte de finalização de vendas, ao subtrair parte do valor, percebi q casas decimais não estão sendo subtraidas, me é retornado a mensagem de empty String segue o print do erro e da tela →

E este é o meu código de calculo →

                         /**************************************************
			 * 
			 *    	  Método que popula os dados de
			 *     		  finalizção de venda 
			 * 
			 **************************************************/
			private static double valorASerPago;
				
			public static void populaFinalizacaoDeVenda() {
					String subTotal = JFrameTelaDeVendas.numberTextFieldSubTotalValue.getText();
					JFrameFinalizacaoVenda.numberTextFieldSubTotalVenda.setText(subTotal);
			}
			
			public static void calculaVenda() {
				DecimalFormat df = new DecimalFormat("#,###.00");
				double valorTotal = Double.parseDouble(JFrameFinalizacaoVenda.numberTextFieldSubTotalVenda.getText());
				double valorAReceber = Double.parseDouble(JFrameFinalizacaoVenda.numberTextFieldValorAReceber.getText());
				if(JFrameFinalizacaoVenda.numberTextFieldValorASerPago.getText().equals("")) 
					valorASerPago = valorTotal - valorAReceber;
				else 
					valorASerPago = valorASerPago - valorAReceber;
				JFrameFinalizacaoVenda.numberTextFieldValorASerPago.setText(String.valueOf(df.format(valorASerPago)));
			}

Double.parseDouble( String numero ) espera uma String que representa o número que será convertido em double usando como separador de casas decimais o ponto ao invés da vírgula. Veja na exceção NumberFormatException.

Além disso, números representados em ponto flutuante não devem ser usados para representar valores monetários. Para isso use a classe BigDecimal que vai lhe garantir precisão arbitrária para números decimais e normalmente é suficiente para o seu problema. Os números em ponto flutuante (float e double) “sofrem” de uma certa imprecisão aritmética.

Cuidado que objetos BigDecimal são imutáveis e não operáveis usando os operadores aritméticos usuais, mas sim através de métodos, que inclusive podem ser encadeados. Segue um exemplo de conversão e operação usando o locale da máquina, ou seja, vai aceitar a vírgula como separador decimal se estiver em pt-BR, que deve ser o seu caso.

import java.math.*;
import java.text.*;

public class Teste {

    public static void main( String[] args ) throws ParseException {

        String s1 =  "2000,1000100011";
        String s2 =  "2000,111111111";

        DecimalFormat df = (DecimalFormat) NumberFormat.getInstance();
        df.setParseBigDecimal( true );

        BigDecimal bd1 = (BigDecimal) df.parse(s1);
        BigDecimal bd2 = (BigDecimal) df.parse(s2);
        BigDecimal bdR = bd1.add( bd2 );

        System.out.println( bd1 + " + " + bd2 + " = " + bdR );

    }

}
2 curtidas

Obrigado David! muito boa sua explicação, troquei os tipos e refiz o código!

1 curtida