在我正在练习的问题中,目标是编写二次表达式,然后将其舍入到千位。这是所需的输出:
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
这与我的取整方式有关吗?在理解此舍入问题方面的任何帮助将不胜感激:)
答案 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);