How do I print a double value without scientific notation using Java?

前端 未结 14 855
一整个雨季
一整个雨季 2020-11-21 11:52

I want to print a double value in Java without exponential form.

double dexp = 12345678;
System.out.println(\"dexp: \"+dexp);

It shows this

14条回答
  •  不知归路
    2020-11-21 12:13

    In short:

    If you want to get rid of trailing zeros and Locale problems, then you should use:

    double myValue = 0.00000021d;
    
    DecimalFormat df = new DecimalFormat("0", DecimalFormatSymbols.getInstance(Locale.ENGLISH));
    df.setMaximumFractionDigits(340); // 340 = DecimalFormat.DOUBLE_FRACTION_DIGITS
    
    System.out.println(df.format(myValue)); // Output: 0.00000021
    

    Explanation:

    Why other answers did not suit me:

    • Double.toString() or System.out.println or FloatingDecimal.toJavaFormatString uses scientific notations if double is less than 10^-3 or greater than or equal to 10^7
    • By using %f, the default decimal precision is 6, otherwise you can hardcode it, but it results in extra zeros added if you have fewer decimals. Example:

      double myValue = 0.00000021d;
      String.format("%.12f", myvalue); // Output: 0.000000210000
      
    • By using setMaximumFractionDigits(0); or %.0f you remove any decimal precision, which is fine for integers/longs, but not for double:

      double myValue = 0.00000021d;
      System.out.println(String.format("%.0f", myvalue)); // Output: 0
      DecimalFormat df = new DecimalFormat("0");
      System.out.println(df.format(myValue)); // Output: 0
      
    • By using DecimalFormat, you are local dependent. In French locale, the decimal separator is a comma, not a point:

      double myValue = 0.00000021d;
      DecimalFormat df = new DecimalFormat("0");
      df.setMaximumFractionDigits(340);
      System.out.println(df.format(myvalue)); // Output: 0,00000021
      

      Using the ENGLISH locale makes sure you get a point for decimal separator, wherever your program will run.

    Why using 340 then for setMaximumFractionDigits?

    Two reasons:

    • setMaximumFractionDigits accepts an integer, but its implementation has a maximum digits allowed of DecimalFormat.DOUBLE_FRACTION_DIGITS which equals 340
    • Double.MIN_VALUE = 4.9E-324 so with 340 digits you are sure not to round your double and lose precision.

提交回复
热议问题