Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/344.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 将双精度四舍五入到最接近的下一个数字_Java_Math_Double_Rounding - Fatal编程技术网

Java 将双精度四舍五入到最接近的下一个数字

Java 将双精度四舍五入到最接近的下一个数字,java,math,double,rounding,Java,Math,Double,Rounding,我想将一个双精度值四舍五入到下一个数字 尝试使用Math.ceil和Math.round,但没有效果 以下是条件和代码: Double totalAsset = Util.convertToDouble(dataObject) * calculus; // 62072560. * 06433535204605706 = 399345.99999999994 System.out.println(totalAsset.longValue()); 但是我得到了399345,而它应该是39934

我想将一个双精度值四舍五入到下一个数字

尝试使用Math.ceil和Math.round,但没有效果

以下是条件和代码:

Double totalAsset = Util.convertToDouble(dataObject) * calculus;

// 62072560. * 06433535204605706 = 399345.99999999994

System.out.println(totalAsset.longValue());

但是我得到了399345,而它应该是399346。

添加If语句是否有帮助


用缩短的1234减去实际结果1234,56,然后检查结果是>=0,5向上取整还是<0,5向下取整?

你的意思是这样的吗? 每个println语句打印399346

public class Test {
    public static void main(final String[] args) {
        final long l0 = (long) Math.ceil(399345.1); //Becomes 399346
        final long l1 = (long) Math.ceil(399345.5); //Becomes 399346
        final long l2 = (long) Math.ceil(399345.6); //Becomes 399346
        final long l3 = (long) Math.ceil(399345.7); //Becomes 399346
        final long l4 = (long) Math.ceil(399345.8); //Becomes 399346
        final long l5 = (long) Math.ceil(399345.9); //Becomes 399346

        System.out.println(l0); //Prints 399346
        System.out.println(l1); //Prints 399346
        System.out.println(l2); //Prints 399346
        System.out.println(l3); //Prints 399346
        System.out.println(l4); //Prints 399346
        System.out.println(l5); //Prints 399346
    }
}

如果您不介意开销,BigDecimal会帮助您:

final BigDecimal a = new BigDecimal("1.899999");
final BigDecimal b = new BigDecimal("1.911111");
System.out.println(a.setScale(1, RoundingMode.UP)); // prints 1.9
System.out.println(b.setScale(1, RoundingMode.UP)); // prints 2.0

要打印,因此不会丢失任何精度,可以使用DecimalFormat

否则,双精度的精确舍入会附加一些字符串。我建议阅读我从中删除此方法的:

public static double round(double value, int places) {
  if (places < 0) throw new IllegalArgumentException();

  BigDecimal bd = new BigDecimal(value);
  bd = bd.setScale(places, RoundingMode.HALF_UP);
  return bd.doubleValue();
}

如果您确实想接收您的号码,我还不清楚,您可以将RoundingMode更改为RoundingMode.天花板。阅读有关RoundingMode的更多信息。

请定义rest。rest表示小数点从5开始。不,这可能还不是每个人都清楚。请展示一系列数字以及你希望它们如何舍入。Math.round就是这样做的。是什么原因使它对你无效?@sTg真的吗?我刚刚测试了System.out.printlnMath.round399345.4;它打印了399345。
public static double round(double value, int places) {
  if (places < 0) throw new IllegalArgumentException();

  BigDecimal bd = new BigDecimal(value);
  bd = bd.setScale(places, RoundingMode.HALF_UP);
  return bd.doubleValue();
}