#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.