使用最多五位总数格式化双精度值,必要时舍入十进制数字

ulm*_*ngt 6 java number-formatting

我有double值,我想转换为String具有以下格式限制的值:

number_of_fraction_digits = max(0,5 - number_of_integer_digits)

基本上我想尽可能将位数保持为5,必要时舍入十进制数字.例如:

 float          String
-------------------------
     1               1
   100             100
100000          100000
 99999           99999
 99999.99        99999
  9999.99         9999.9
   999.99          999.99
    23.34324        23.343

我已经研究过使用DecimalFormat,但据我所知,它并没有完全实现我所追求的目标.

它允许设置最大小数位数,setMaximumFractionDigits()但据我所知,我必须计算整数位数并自己执行上述计算.

所以基本的问题是,是否有一种漂亮,干净的内置方式来以这种方式格式化数字.

ecl*_*cle 6

public class SignificantFormat {

    public static String formatSignificant(double value, int significant)
    {
        MathContext mathContext = new MathContext(significant, RoundingMode.DOWN);
        BigDecimal bigDecimal = new BigDecimal(value, mathContext);
        return bigDecimal.toPlainString();
    }

    public static void main(String[] args) {
        double[] data = { 1, 100, 100000, 99999, 99999.99, 9999.99, 999.99, 23.34324 };
        for(double d: data){
            System.out.printf("Input: %10s \tOutput: %10s\n", Double.toString(d), formatSignificant(d, 5));
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 这不是一个错误.由于999.99不能完全表示为浮点数,因此选择最接近的值999.989990234375.四舍五入为有效数字为999.98,如预期. (2认同)