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

前端 未结 14 854
一整个雨季
一整个雨季 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:06

    This will work as long as your number is a whole number:

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

    If the double variable has precision after the decimal point it will truncate it.

    0 讨论(0)
  • 2020-11-21 12:07

    You could use printf() with %f:

    double dexp = 12345678;
    System.out.printf("dexp: %f\n", dexp);
    

    This will print dexp: 12345678.000000. If you don't want the fractional part, use

    System.out.printf("dexp: %.0f\n", dexp);
    

    0 in %.0f means 0 places in fractional part i.e no fractional part. If you want to print fractional part with desired number of decimal places then instead of 0 just provide the number like this %.8f. By default fractional part is printed up to 6 decimal places.

    This uses the format specifier language explained in the documentation.

    The default toString() format used in your original code is spelled out here.

    0 讨论(0)
  • 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.
    0 讨论(0)
  • 2020-11-21 12:13

    I think everyone had the right idea, but all answers were not straightforward. I can see this being a very useful piece of code. Here is a snippet of what will work:

    System.out.println(String.format("%.8f", EnterYourDoubleVariableHere));
    

    the ".8" is where you set the number of decimal places you would like to show.

    I am using Eclipse and it worked no problem.

    Hope this was helpful. I would appreciate any feedback!

    0 讨论(0)
  • 2020-11-21 12:15

    I had this same problem in my production code when I was using it as a string input to a math.Eval() function which takes a string like "x + 20 / 50"

    I looked at hundreds of articles... In the end I went with this because of the speed. And because the Eval function was going to convert it back into its own number format eventually and math.Eval() didn't support the trailing E-07 that other methods returned, and anything over 5 dp was too much detail for my application anyway.

    This is now used in production code for an application that has 1,000+ users...

    double value = 0.0002111d;
    String s = Double.toString(((int)(value * 100000.0d))/100000.0d); // Round to 5 dp
    
    s display as:  0.00021
    
    0 讨论(0)
  • 2020-11-21 12:16

    My solution: String str = String.format ("%.0f", yourDouble);

    0 讨论(0)
提交回复
热议问题