Математика Java с плавающей точкой - (перевод в футы / метры) - PullRequest
3 голосов
/ 04 марта 2009

Довольно простой вопрос, я думаю - я выполняю эту функцию:

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 значащие цифры оставались в соответствии с моим коэффициентом конверсии.

Ответы [ 5 ]

8 голосов
/ 04 марта 2009

Вы можете использовать NumberFormat экземпляр.

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

Или вы можете использовать DecimalFormat .

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

Последний (DecimalFormat), должен использоваться, когда вы явно хотите указать формат, а первый (NumberFormat), когда хотите локализованные настройки.

Для четырех последовательных дробных чисел нет необходимости перетаскивать в BigDecimal, если вы не работаете с очень большими расстояниями.

3 голосов
/ 04 марта 2009

Я отвечаю на свой вопрос ради потомков. Я использовал ответ 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;
}
1 голос
/ 04 марта 2009

Если вам нужны точные вычисления, используйте BigDecimal вместо float. Если вы просто хотите обрезать при печати, используйте DecimalFormat .

DecimalFormat df = new DecimalFormat ("0.00");
System.out.println(df.format(convertMetersToFeet(101)));
0 голосов
/ 05 марта 2009

Если это не для печати, вы не должны заботиться об ошибке. 337.36080000000004 точно так же, как и 337.3608, поскольку у вас есть только 5 значащих цифр в коэффициенте и только 3 в тестовом входе. (И я, конечно, надеюсь, что ваш метод дал 331, а не 337)

Однако эта строка, извлеченная из другого вопроса , похоже, тоже помогает.

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

Единственная проблема в том, что переполнение происходит намного быстрее.

0 голосов
/ 04 марта 2009

Используйте java.math.BigDecimal для десятичной арифметики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...