Проблема округления с помощью квадратичной программы

В задаче, которую я выполняю, цель состоит в том, чтобы написать квадратное выражение, а затем округлить его до тысячных разрядов. Вот желаемый результат:

1 (переменная) 6 (переменная b) 3 (переменная c)

4 (переменная) 10 (переменная b) 6,1 (переменная c)

Вывод: -0,551, -5,449 (ответ на верхнюю строку)

-1,056, -1,444 (ответ за нижнюю строку)

Вопрос не в том, как решить проблему, а в ответах, которые я получаю. При вычислении квадратного уравнения следующим образом:

      double a = scan.nextDouble(); 
      double b = scan.nextDouble(); 
      double c = scan.nextDouble(); 

      //equation is correct
      double answer1 = 0.001 * Math.floor((-b + Math.sqrt(Math.pow(b, 2) - (4 * a * c))) / (2 * a)* 1000.0) ;
      double answer2 = 0.001 * Math.floor((-b - Math.sqrt(Math.pow(b, 2) - (4 * a * c))) / (2 * a) * 1000.0);

Я получаю правильные ответы, за исключением случаев, когда я начинаю округлять до тысячных долей, некоторые числа верны, а другие нет, даже если похоже, что они округляются правильно, но не в соответствии с проблемой.

Мой результат: -0,551, -5,45 -1,057, -1,444

Это как-то связано с тем, как я округляю? Любая помощь в понимании этой проблемы округления будет оценена :)

"когда я запускаю округление" Что заставляет вас думать, что Math.floor делает округление? Math.round будет методом, который выполняет округление.
Andreas 10.01.2019 03:56
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
1
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

https://floating-point-gui.de/languages/java/

Как округлить

Чтобы получить строку:

String.format("%.2f", 1.2399) // returns "1.24"
String.format("%.3f", 1.2399) // returns "1.240"
String.format("%.2f", 1.2) // returns "1.20"

Чтобы распечатать на стандартный вывод (или любой PrintStream):

System.out.printf("%.2f", 1.2399) // same syntax as String.format()

Если вы не хотите нулей в конце:

new DecimalFormat("0.00").format(1.2)// returns "1.20"
new DecimalFormat("0.##").format(1.2)// returns "1.2"

Если вам нужен определенный режим округления:

new BigDecimal("1.25").setScale(1, RoundingMode.HALF_EVEN); // returns 1.2

И если вам нужно округлить фактическое число, а не только распечатанный результат:

  double result = Math.round(value * scale) / scale;

где scale может быть зафиксирован на 1000 для трех десятичных знаков или рассчитан для произвольного количества десятичных знаков:

  int scale = (int) Math.pow(10, precision);
Как округлить: Используйте Math.round(), а не Math.floor()
Andreas 10.01.2019 04:01

Это, вероятно, тоже поможет. :-) Но часто, когда люди говорят об округлении чисел с плавающей запятой, на самом деле имеют в виду округление вывода, напечатанного результата.

markspace 10.01.2019 04:20

Другие вопросы по теме