В задаче, которую я выполняю, цель состоит в том, чтобы написать квадратное выражение, а затем округлить его до тысячных разрядов. Вот желаемый результат:
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
Это как-то связано с тем, как я округляю? Любая помощь в понимании этой проблемы округления будет оценена :)




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()Это, вероятно, тоже поможет. :-) Но часто, когда люди говорят об округлении чисел с плавающей запятой, на самом деле имеют в виду округление вывода, напечатанного результата.
Math.floorделает округление?Math.roundбудет методом, который выполняет округление.