Search code examples
javaprecisionexponential

Exponential Precision [print double, tiny number]


Is there a way of printing with EXPONENTIAL PRECISION ? I need to fill up some data with tiny numbers and compare those after....

I have like this:

(0) - Mesured estimatedTime for multithread in block: 1.4917951E16 s
(1) - Mesured estimatedTime for multithread in block: 7.531891E15 s
(2) - Mesured estimatedTime for multithread in block: 2.9287E13 s
(3) - Mesured estimatedTime for multithread in block: 3.28478435E17 s
(4) - Mesured estimatedTime for multithread in block: 6.038E12 s

And i want to print like this:

(0) - Mesured estimatedTime for original in block: 0000.15595175E15 s           
(1) - Mesured estimatedTime for original in block: 0007.335638E15 s             
(2) - Mesured estimatedTime for original in block: 0416.66E15 s                 
(3) - Mesured estimatedTime for original in block: 0000.0390156852E15 s         
(4) - Mesured estimatedTime for original in block: 6642.0E15 s

I know that you can force it like this:

// Force minimum number of digits to left and right of decimal point
formatter = new DecimalFormat("0.0E0");
s = formatter.format(-1234.567);         // -1.2E3

But don't know how i can force it to Expo-Precision :(((( help!! :/


Solution

  • It appears you want to imply a precision of 1e15.

    for (double d : new double[]{1.4917951E16, 7.531891E15, 2.9287E13, 3.28478435E17, 6.038E12})
        System.out.printf("%11fE15%n", d/1e15);
    

    prints

      14.917951E15
       7.531891E15
       0.029287E15
     328.478435E15
       0.006038E15
    

    If the range is much wider you can use DecimalFormat

    DecimalFormat df = new DecimalFormat();
    df.setMaximumFractionDigits(300);
    df.setGroupingUsed(false);
    for(double d = 1 ; d <= 1e30; d *= 1e5) {
        System.out.println(df.format(d/1e15)+"E15");
    }
    

    prints

    0.000000000000001E15
    0.0000000001E15
    0.00001E15
    1E15
    100000E15
    10000000000E15