Como faço para formatar input dupla em Java sem arredondá-lo?

Eu li esta pergunta Round a double to 2 decimal places Mostra como arredondar o número. O que eu quero é apenas formatação simples, imprimindo apenas duas casas decimais. O que eu tenho e o que eu tentei:

double res = 24.695999999999998; DecimalFormat df = new DecimalFormat("####0.00"); System.out.println("Value: " + df.format(res)); //prints 24.70 and I want 24.69 System.out.println("Total: " + String.format( "%.2f", res )); //prints 24.70 

Então, quando eu tenho 24,695999999999998 eu quero formatá-lo como 24,69

Você precisa primeiro tomar o floor do valor duplo – depois formatá-lo.

Math.floor (duplo)

Retorna o maior valor duplo (mais próximo ao infinito positivo) que é menor ou igual ao argumento e é igual a um inteiro matemático.

Então use algo como:

 double v = Math.floor(res * 100) / 100.0; 

Outras alternativas incluem o uso de BigDecimal .

 public void test() { double d = 0.29; System.out.println("d=" + d); System.out.println("floor(d*100)/100=" + Math.floor(d * 100) / 100); System.out.println("BigDecimal d=" + BigDecimal.valueOf(d).movePointRight(2).round(MathContext.UNLIMITED).movePointLeft(2)); } 

impressões

 d=0.29 floor(d*100)/100=0.28 BigDecimal d=0.29 

Além de usar Math.floor(double) e calcular uma escala (por exemplo, * 100 e, em seguida, / 100.0 para duas casas decimais), você poderia usar BigDecimal , então você pode invocar setScale(int, int) como

 double res = 24.695999999999998; BigDecimal bd = BigDecimal.valueOf(res); bd = bd.setScale(2, RoundingMode.DOWN); System.out.println("Value: " + bd); 

Que também lhe dará (o solicitado)

 Value: 24.69 

Multiplique o número por 100 e lance-o para um inteiro. Isso corta todos os espaços decimais, exceto os dois que você deseja. Divida o resultado por 100,00. (24,69).

 int temp = (int)(res * 100); double result = temp / 100.00; 

ou a mesma coisa em uma linha de código:

 double result = ((int)(res * 100)) / 100.00; 
Intereting Posts