Java - double 常量小数位数

Java - double constant number of decimal places

我有两个双变量:

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

但是 b 是可变的,我想根据 b 数字实现固定的小数位数,例如上面我想实现这个结果:

Result = 1.10900

但不仅是打印,我还需要将它发送到其他方法,我的双精度数必须像示例中那样具有固定的小数位数。

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

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

听起来您希望实际值具有任意精度(而不是仅仅输出)。 double 不会给你那个。 BigDecimal does though. Its BigDecimal(String) constructor 从字符串设置值和比例(小数点右边的位数),因此:

BigDecimal d = new BigDecimal("1.10900");

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

如果在某些时候您需要获取 BigDecimaldouble 值,您可以使用它的 doubleValue method。但请注意,此时小数点右边的位数不再固定。

这是一个对比 BigDecimaldouble (Live Copy) 的例子:

import java.math.*;

class Example
{
    public static void main (String[] args) throws java.lang.Exception
    {
        BigDecimal bd = new BigDecimal("1.10900");
        bd = bd.divide(new BigDecimal("27"), BigDecimal.ROUND_HALF_DOWN);
        System.out.println("1.109 / 27 using BigDecimal to five places: " + bd);

        double d = 1.109;
        d = d / 27.0;
        System.out.println("1.109 / 27 using double:                    " + d);
    }
}

输出:

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

使用类似于 java printf 的例程(注意它会产生平台相关的小数点分隔符):

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

一个简单的解决方案是根据需要对结果进行四舍五入。这不仅比使用 BigDecimal 更快,而且更不容易出错,因为 Java 没有对 BigDecimal 的语言支持,这使得 write/read 和验证变得更加困难。将 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);