我想将一个double值舍入到下一个数字。
尝试使用Math.ceil
和Math.round
,但它没有帮助。
以下是条件和代码:
Double totalAsset = Util.convertToDouble(dataObject) * calculus;
// 62072560. * 06433535204605706 = 399345.99999999994
System.out.println(totalAsset.longValue());
但是我得到399345
,而它应该是399346
。
答案 0 :(得分:1)
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
}
}
答案 1 :(得分:1)
要打印,因此不会失去任何精度,您可以使用DecimalFormat
。
DecimalFormat df = new DecimalFormat("#.#");
double d = 1.899999;
System.out.println(df.format(d));
否则,double的精确舍入会附加一些字符串。我建议阅读following answer我从这个方法中删除了这个方法:
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.CEILING
。阅读有关RoundingMode here的更多信息。
答案 2 :(得分:0)
可以添加If语句帮助吗?
使用缩短的(1234)对实际结果(1234,56)进行减法,并检查结果是否>> 0,5以向上舍入或<&lt; 0,5向下舍入?
答案 3 :(得分:0)
如果你不介意开销,那么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