Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Best way to print 2 doubles with same exponent

How to best print 2 float numbers in scientific-notation but with same exponent? eg: I'd like to print numbers like this:

 1.234e-6 
11.234e-6

And I would like some function to detect automatically best exponent - that is smaller number always start at first decimal digit and bigger number prints how it must with same exponent. eg: 0.1 and 100 would print

   1.000e-1
1000.000e-1

But even when I ask explicitly for 2 decimal places String.format("%2.3e",11.234e-6) I got 1.123e-5

like image 937
Vit Bernatik Avatar asked Apr 16 '15 13:04

Vit Bernatik


People also ask

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

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

What is E in double value?

In scientific notation, the letter E is used to mean "10 to the power of." For example, 1.314E+1 means 1.314 * 101 which is 13.14 . Scientific notation is merely a format used for input and output. The 64-bit pattern used for a double inside the computer are the same, no matter what character format was used for input.

How do you avoid large numbers in scientific notation in Python?

Summary: Use the string literal syntax f"{number:. nf}" to suppress the scientific notation of a number to its floating-point representation.


1 Answers

So far I come up with code bellow. It works as I want. But as you can see it is not exactly short or swift... It would be great if someone would point to some Java native functions which helps me to do it more elegant...

public static String repeat(int count, String with) {
    if(count<0){
        return "";
    }
    if(count>1e5){
        return "";
    }
    return new String(new char[count]).replace("\0", with);
}

public static String getFormattedDouble(double num,int posInt,int posFrac){
    if(num == 0) return "0"; // correct 0 value to be print only with one 0
    String sInt = repeat(posInt,"0");
    String sFrac = repeat(posFrac,"0");
    String sSing = num<0 ? "" : "+";
    DecimalFormat form = new DecimalFormat(sSing+sInt+"."+sFrac+"E0");
    String s = form.format(num);
    s = s.replace("E","e"); // I really thing capital E looks ugly
    return s;
}

public static String[] get2doublesSameExp(double a, double b){
    String[] s = new String[2];
    int expA;
    if(a == 0) expA = 0;
    else       expA = (int)Math.floor(Math.log10(Math.abs(a)));
    int expB;
    if(b == 0) expB = 0;
    else       expB = (int)Math.floor(Math.log10(Math.abs(b)));
    double expDif = Math.abs((double)expA-(double)expB);
    int fractPos = 3;
    if(expDif > 4) fractPos = 1; // too big exponent difference reduce fraction digits
    if(expDif > 6){
        // too big exponent difference print it normally it will be nicer
        s[0] = String.format("%1.3e",a);
        s[1] = String.format("%1.3e",b);
        return s;
    }
    int minExp = Math.min(expA,expB) - 1;
    s[0] = getFormattedDouble(a, expA - minExp, fractPos );
    s[1] = getFormattedDouble(b, expB - minExp, fractPos );
    // just text right justification
    String rightJust = repeat((int)expDif," ");
    int justIdx = expA < expB ? 0 : 1;
    s[justIdx] = rightJust + s[justIdx];
    return s;
}
String[] s = get2doublesSameExp(1.234e-6,11.234e-6);
like image 96
Vit Bernatik Avatar answered Sep 18 '22 16:09

Vit Bernatik