The best way to print 2 double rooms with the same rate

What is the best way to print 2 floating point numbers in scientific notation, but with the same exponent? for example: I would like to print these numbers:

1.234e-6 11.234e-6 

And I would like for some function to automatically determine the best exponent - this is the smaller number that always starts with the first decimal digit, and the larger number prints as it should with the same exponent. for example: 0.1 and 100 will print

  1.000e-1 1000.000e-1 

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

+6
source share
1 answer

While I come up with the code below. It works the way I want. But, as you can see, this is not entirely short or fast ... It would be great if someone pointed out some of the native Java features that help me make this 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); 
+1
source

Source: https://habr.com/ru/post/985267/


All Articles