二次程序的四舍五入问题

时间:2019-01-10 02:49:26

标签: java

在我正在练习的问题中,目标是编写二次表达式,然后将其舍入到千位。这是所需的输出:

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

这与我的取整方式有关吗?在理解此舍入问题方面的任何帮助将不胜感激:)

1 个答案:

答案 0 :(得分:3)

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);