Here's a java solution using String.format.
public static String toPrecision(double d, int digits) { s = String.format("%."+((digits>0)?digits:16)+"g",d).replace("e+0","e+").replace("e-0","e-"); return s; }
. Replace is only needed if you want to emulate javascript where it does not have index pointers. If you just use it for rounding, return the value as
return Double.parseDouble(s);
Here is the unit test code:
public void testToPrecision() { String s = NumberFormat.toPrecision(1234567.0,5); assertEquals("1.2346e+6",s); s = NumberFormat.toPrecision(12.34567,5); assertEquals("12.346",s); s = NumberFormat.toPrecision(0.1234567,5); assertEquals("0.12346",s); s = NumberFormat.toPrecision(0.1234567e20,5); assertEquals("1.2346e+19",s); s = NumberFormat.toPrecision(-0.1234567e-8,5); assertEquals("-1.2346e-9",s); s = NumberFormat.toPrecision(1.0/3.0,5); assertEquals("0.33333",s); s = NumberFormat.toPrecision(1.0/3.0,0); assertEquals("0.3333333333333333",s); }
Glenn source share