Как вы уменьшаете java double до n значащих цифр?

#java #decimal #bigdecimal #decimalformat #rounding-error

#java #десятичный #bigdecimal #десятичный формат #ошибка округления

Вопрос:

Я хочу напечатать маленькие цифры ( doubles ) с целью вывода ошибок при использовании методов Newton amp; Secant .

Одна из моих ошибок 5.433306166802499E-5

Я хотел бы напечатать 5.4333E-5

Я думал об использовании BigDecimal , но я не знаком с этим классом.

Комментарии:

1. Вы просто хотите отформатировать число для печати. Не возитесь со значением (т. Е. Не «уменьшайте до n цифр»).

2. @ScaryWombat не согласен. Он просто хочет отформатировать double для вывода.

3. @JimGarrison Хорошо, похоже, я придаю слишком большое значение названию.

Ответ №1:

Я ищу, чтобы напечатать маленькие цифры (удваивается)

 System.out.printf("%.4e",  5.433306166802499E-5);
  

Результат: 5.4333e-05

Примечание: это не уменьшает точность вашего исходного значения, оно просто выводит его с меньшей точностью.

Комментарии:

1. Вы не указали спецификатор формата «e»; Я добавил его, чтобы ваш ответ действительно работал.

2. @JimGarrison Спасибо, я не знаю, как я потерял e

Ответ №2:

double d = 5.433306166802499E-5;
BigDecimal dc = new BigDecimal(d);
dc = dc .round(new MathContext(3)); // desired significant digits
double rounded = dc .doubleValue();

Ответ №3:

Вы действительно можете использовать BigDecimal, тогда это будет выглядеть следующим образом:

 BigDecimal d = BigDecimal.valueOf(val).setScale(scale, RoundingMode.HALF_UP);
double scaled = d.doubleValue();
  

Или вы могли бы использовать:

 Math.round(val*Math.pow(10, scale))/Math.pow(10, scale);
  

Комментарии:

1. В первом примере слишком много запятых, и если val = 5.433306166802499E-5 как указано в вопросе, результат будет 1.0E-4 , что далеко от желаемого результата 5.4333E-5 .

Ответ №4:

Чтобы ответить на общий вопрос о сокращении значащих цифр double, а не только на случай печати с System.out.printf :

Если вы используете Java: Double.parseDouble(String.format("%1.4e", 5.433306166802499E-5))

В Scala вы можете использовать f интерполятор строк или метод format:

 val a: Double = 5.433306166802499E-5
val reduced1: Double = f"$a%1.4e".toDouble
val reduced2: Double = "%1.4e".format(a).toDouble
  

Оба равны: 5.4333e-05

Комментарии:

1. Вопрос касается java, но этот ответ — Kotlin.

2. Мой ответ был для Scala. Не уверен насчет интерполятора строк f, но String.format метод должен работать для Java.