Imprimir número com casas decimais truncadas

       Olá. Gostaria de saber como faço para que, por exemplo um número calculado por um programa cujo valor foi 5.3456789, seja exibido apenas com 2 casas decimais e fique assim 5.34?
       Agradeço a todos.

Que eu saiba, 5.3456789 deve ser arredondado para 5.35.
Se eu fosse seu professor, você gostaria que sua nota fosse truncada, em vez de arredondada?

De qualquer forma, ele pode ser visualizado usando-se System.out.printf ("%.2f", valor), String.format ("%.2f", valor), (new DecimalFormat(“0.##”)).format (valor) - escolha o seu método preferido.

Depende… vc vai exibir isso onde? No console ou em uma interface? Com JLabel? Como?

[quote=thingol]Que eu saiba, 5.3456789 deve ser arredondado para 5.35.
Se eu fosse seu professor, você gostaria que sua nota fosse truncada, em vez de arredondada?
[/quote]

heheh, valeu Thingol, mas acho que vc não leu o título do meu tópico direito. Eu coloquei a palavra “TRUNCADA” justamente pra não gerar dúvida pra quem lesse. Em nenhum momento me referi a arredondamento. Não sei onde vc viu essa palavra. Até pq não sei se o java arredonda ou trunca. Mas de qualquer forma valeu pela dica. :slight_smile:

Ah, em relação a pergunta do Cassio, estou exibindo isso numa interface(JTextArea).
Valeu pessoal!

1 curtida
textField.setText(String.format ("%.2f", textField.getText()));

Talvez o que vc queira seja um InputVerifier…

Para truncar mesmo (tá bom), o jeito mais estúpido é multiplicar por 100, truncar e dividir de novo por 100.
Tem gente que usa o tal do BigDecimal, mas em particular acho meio complicado de usar.

double d = 5.3456789;
d = (Math.floor (d * 100.0) / 100.0; 

Note que fazer essa conta ainda não garante que você vai ter algo impresso como “5.35”; pode ser que a conta dê, por causa das operações de ponto flutuante, algo como “5.35000000001” ou “5.3499999998”.
Então você tem ainda de usar o tal do printf, ou String.format, ou DecimalFormat.format, como mostrado acima.

Vou explicar melhor. Tenho uma aplicação matemática que realiza algumas contas internar e tem que mostrar o resultado num textArea. Essas contas são feitas com uma precisão muito grande e o resultado final sai com 8 números depois da vírgula. Não estou querendo mudar a precisão da conta e do resultado final. O que eu quero é “colar” no JTextArea o resultado final, porém com 3 casas decimais depois da vírgula e não 8. Ou seja quero imprimir o resultado encontrado com menos casas decimais do que tem o seu valor original.

Mas então você tem de arredondar mesmo, não truncar.
Por exemplo, pi = 3.142, não 3.141. (O valor de pi, como devem saber, é 3.141592653589793…)

[quote=cassio] textField.setText(String.format ("%.2f", textField.getText())); [/quote]
Cassio, usei isso, mas ele acusa que o segundo parâmetro de String.format deve ser do tipo Object.

[quote=thingol]Mas então você tem de arredondar mesmo, não truncar.
Por exemplo, pi = 3.142, não 3.141. (O valor de pi, como devem saber, é 3.141592653589793…)
[/quote]
Cara, então não é possível truncar números em java?? O que eu quero é apenas IMPRIMIR o número com 3 casas decimais ao invés de 8. As contas internas serão as mesmas. Não estou querendo fazer isso na unha, pois vai me dar mais trabalho. O usuário SÓ VAI PRECISAR VER 3 números após a vírgula e a implicação lógica disso não é importante nessa aplicação. Só quero truncar o resultado final.

fiz isso

JTextField textField = new JTextField("236.254456");
textField.setText(String.format ("%.2f", Double.parseDouble(textField.getText())));
System.out.println(textField.getText());

E deu certinho… Só coloquei o Double.parseDouble(), que antes estava a String direto e estava dando pau…

“String is a Object”…

Mas o segundo parâmetro desse método é o valor a formatar, ou seja, o seu double ou float contendo diversas casas decimais. Aí basta especificar “%.3f”, e o resultado vai ser suprimido para 3 casas decimais… mas não sei dizer se serão as 3 primeiras casas após a vírgula, ou o arredondamento do resultado, como já foi discutido aqui. Creio que java não faz o arredondamento, apenas imprime até o terceiro caractere depois da vírgula.

Rodrigo

eu já acho que ele arredonda sim… mas só fazendo o teste para ver.

outro modo, que já foi citado, usando o BigDecimal e seus amigos:

BigDecimal numero = BigDecimal.valueOf(numeroCom8Casas); BigDecimal numeroCom3Casas = numero.round(new MathContext(3, RoundingMode.DOWN));

da pra resumir para

BigDecimal.valueOf(numeroCom8Casas).round(new MathContext(3, RoundingMode.DOWN));

hehe

Conferi aqui moçada, ele realmente arredonda com o comando BigDecimal. Tô pensando em fazer uma função na unha mesmo, e criar um string só com a quantidade de casas decimais que eu quero mesmo. Mas mesmo assim, valeu pela ajuda, moçada!

E o printf() tbém arredonda…

double n1 = 1.098765;
System.err.printf("%f -> %.3f", n1, n1); // mostra "1.098765 -> 1.099"

Rodrigo

Opa, BigDecimal não arredondou não… se bem que como estou usando o java 1.4, não consegui compilar meu teste ali de cima.

Porém, este consegue mostrar o mesmo comportamento, acredito eu…

[code]package teste.guj;

import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.math.BigDecimal;

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JTextField;

public class TesteBigDecimalArredondando extends JFrame implements ActionListener {

private static final long serialVersionUID = 1L;

private JTextField numeroOriginal;

private JTextField numeroNovo;

public TesteBigDecimalArredondando() {
	super();
	setTitle(getClass().toString());
	setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

	getContentPane().setLayout(new GridLayout(2, 2));
	getContentPane().add(new JLabel("Número original"));
	numeroOriginal = new JTextField(15);
	numeroOriginal.setText("5.3456789");
	getContentPane().add(numeroOriginal);
	getContentPane().add(new JLabel("Número novo"));
	numeroNovo = new JTextField(15);
	getContentPane().add(numeroNovo);

	numeroOriginal.addActionListener(this);

	pack();
}

public void actionPerformed(ActionEvent e) {
	String n = numeroOriginal.getText();
	BigDecimal x = new BigDecimal(n);
	BigDecimal x2 = x.setScale(3, BigDecimal.ROUND_DOWN);
	numeroNovo.setText(x2.toString());
}

public static void main(String[] args) {
	new TesteBigDecimalArredondando().setVisible(true);
}

}
[/code]

Você coloca o nº em cima e aperta enter pra ver a conversão…

flw

Hey, não seria essa a indicação do arredondamento? Me parece que isso determina a política de arredondamento para “arredondar para baixo”.

Mas, hey… por que a gente tá levando isso adiante? :stuck_out_tongue:

Rodrigo

no javadoc:

   //BigDecimal.class
    /**
     * Rounding mode to round towards zero.  Never increments the digit
     * prior to a discarded fraction (i.e., truncates).  Note that this
     * rounding mode never increases the magnitude of the calculated value.
     */
    public final static int ROUND_DOWN =         1;

portanto, acho que é isso mesmo…

nao entendi . :frowning:

Foi porque achei irrelevante a gente continuar tentando descobrir esses detalhes, o OP já recebeu resposta, e tá fazendo uma aplicação bem específica… :stuck_out_tongue:

Mas é isso mesmo, eu não tinha visto a javadoc, usando BigDecimal resolve o “problema”, como vocês indicaram :wink:

Rodrigo

da certinho mesmo!!! o meu calcula o troco perfeito mesmo olhem o codigo abaixo

[code]
public void calculaTroco()

{
    double valor41=0;
    String CalculaTroco=(String.valueOf(Double.parseDouble(tfValorPago.getText()) - 
     Double.parseDouble(tfValorTotalVenda.getText())));
     
     valor41=(Double.parseDouble(CalculaTroco));
      
    
     double x = valor41; 
     BigDecimal valor12 = new BigDecimal(x).setScale(2, BigDecimal.ROUND_UP);   
    System.out.println(valor12);
    
     tfTroco.setText(String.valueOf(valor12));
     [/code]