Java - 两位常数小数位

时间:2016-02-22 08:27:40

标签: java math rounding

我有两个双变量:

double a = 1.109
double b = 5.0E-5;

但是b是可以改变的,我希望根据b数字获得固定数量的小数位数,例如上面我希望达到这个结果:

Result = 1.10900

但不仅打印,我需要将其发送到其他方法,我的双必须有固定数量的小数位,如例子。

4 个答案:

答案 0 :(得分:3)

听起来你想要实际值的任意精度(而不仅仅是输出)。 double并没有给你这个。 BigDecimal确实如此。它的BigDecimal(String) constructor设置字符串的值和比例(小数点右边的位数),所以:

BigDecimal d = new BigDecimal("1.10900");

BigDecimal然后为您提供各种数学运算以保持在该范围内,并提供各种舍入选项。

如果您在某个时候需要获得double的{​​{1}}值,则可以使用其doubleValue method。但请注意,此时,您再也不会在小数点右侧有固定数量的位置。

以下是对比BigDecimalBigDecimalLive Copy)的示例:

double

输出:

1.109 / 27 using BigDecimal to five places: 0.04107
1.109 / 27 using double:                    0.041074074074074075

答案 1 :(得分:1)

尝试使用数字格式化程序:

NumberFormat formatter = new DecimalFormat("#0.00000");     
double a = 1.109;
double b = 5.0E-5;
System.out.println(a);
System.out.println(b);

<强>输出:

1.10900
0.00005

答案 2 :(得分:0)

一个简单的解决方案是根据需要对结果进行舍入。这不仅比使用BigDecimal更快,而且因为Java没有BigDecimal语言支持使得编写/读取和验证更加困难,因此它不易出错。将半个舍入为5个十进制空格的简单方法是

public static double round5(double d) {
    final double factor = 1e5;
    return d > Long.MAX_VALUE / factor || d < -Long.MAX_VALUE / factor ? d :
            (long) (d < 0 ? d * factor - 0.5 : d * factor + 0.5) / factor;
}

注意:当您打印double时,您仍需要指定所需的小数位数。

System.out.printf("%.5f", value);

答案 3 :(得分:-1)

使用java printf - 就像例程一样(注意它产生平台相关的小数分隔符):

String.format("%.5f", a)