Java ponto flutuante matemática - (conversão de pés / metros)
-
03-07-2019 - |
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.
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.