Математика Java с плавающей точкой - (перевод в футы / метры)
-
03-07-2019 - |
Вопрос
Я думаю, довольно простой вопрос - я выполняю эту функцию:
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;
}
Проблема - выход; например я получаю 337.36080000000004 от входа 101. Какова подходящая практика для усечения чисел с плавающей запятой?
Как и предполагалось в ответах ниже, я бы хотел, чтобы 4 значащие цифры соответствовали моему коэффициенту конверсии.
Решение
Вы можете использовать NumberFormat instance.
NumberFormat nf = NumberFormat.getInstance(Locale.UK);
nf.setMinimumFractionDigits(4);
nf.setMaximumFractionDigits(4);
System.out.println(nf.format(feet));
Другие советы
Я отвечаю на свой вопрос ради потомков. Я использовал ответ DecimalFormat выше, но в ответах не учитывался тип возврата метода. Р>
Вот готовый код:
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;
}
Если вам нужны точные расчеты, используйте BigDecimal вместо float. Если вы просто хотите урезать при печати, используйте DecimalFormat а>. р>
DecimalFormat df = new DecimalFormat ("0.00");
System.out.println(df.format(convertMetersToFeet(101)));
Используйте java.math.BigDecimal
для десятичной арифметики.
Если это не для печати, вы не должны заботиться об ошибке. 337.36080000000004 точно так же, как и 337.3608, поскольку у вас есть только 5 значащих цифр в коэффициенте и только 3 в тестовом входе. (И я, конечно, надеюсь, что ваш метод дал 331, а не 337)
Однако эта строка, извлеченная из другого вопроса , кажется, помогает а также.
double toFeet = ((int)(meters*3.2808*10000))/10000.0;
Единственная проблема заключается в том, что переполнение происходит намного быстрее.