Pergunta

questão Bastante básico eu acho - eu estou realizando esta função:

private double convertMetersToFeet(double meters)
{
  //function converts Feet to Meters.
      double toFeet = meters;
      toFeet = meters*3.2808;  // official conversion rate of Meters to Feet
      return toFeet;
}

O problema é que a saída; por exemplo, eu recebo 337,36080000000004 partir de uma entrada de 101. Qual é a prática adequada para truncar os pontos flutuantes?

Como as respostas abaixo assumido, eu quero 4 algarismos significativos para manter a coerência com a minha taxa de conversão.

Foi útil?

Solução

Você pode usar um NumberFormat instância.

NumberFormat nf = NumberFormat.getInstance(Locale.UK);
nf.setMinimumFractionDigits(4);
nf.setMaximumFractionDigits(4);
System.out.println(nf.format(feet));

Ou você pode usar DecimalFormat .

DecimalFormat df = new DecimalFormat("0.0000");
System.out.println(df.format(feet));

A última (DecimalFormat), é para ser usado quando você quer explicitamente afirmar o formato eo ex-(NumberFormat), quando quiser que as configurações localizadas.

Durante quatro números fracionários consistentes, não há necessidade de arrastar em BigDecimal, se o seu não está trabalhando com muito longas distâncias.

Outras dicas

Eu estou respondendo a minha própria pergunta para a posteridade. Eu usei a resposta DecimalFormat acima, mas as respostas não levou em conta o tipo de retorno do método.

Aqui está o código acabado:

  private double convertMetersToFeet(double meters)
{
  //function converts Feet to Meters.
      double toFeet = meters;
      toFeet = meters*3.2808;  // official conversion rate of Meters to Feet
      String formattedNumber = new DecimalFormat("0.0000").format(toFeet); //return with 4 decimal places
      double d = Double.valueOf(formattedNumber.trim()).doubleValue();
      return d;
}

Se precisar de cálculos precisos, use BigDecimal em vez de float. Se você quiser apenas para truncar na impressão, use DecimalFormat .

DecimalFormat df = new DecimalFormat ("0.00");
System.out.println(df.format(convertMetersToFeet(101)));

Use java.math.BigDecimal para a aritmética decimal.

Se não for para a impressão de que você não deve se preocupar com o erro. 337,36080000000004 é tão correto como 337,3608 desde que você só tem 5 algarismos significativos no fator e apenas 3 na entrada de teste. (E eu certamente espero que a resposta seu método deu foi 331 e não 337)

No entanto, esta linha obtida a partir de uma outra pergunta parece fazer o truque também.

double toFeet = ((int)(meters*3.2808*10000))/10000.0;

O único problema é que é transborda muito mais rápido.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top