5

As you all know since it is one of the most asked topic on SO, I am having problems with rounding errors (it isn't actually errors, I am well aware). Instead of explaining my point, I'll give an example of what possible numbers I have and which input I want to be able to obtain:

Let's say

var a = 15 * 1e-9;
alert(a)

outputs

1.5000000000000002e-8

I want to be able to obtain 1.5e-8 instead, but I cannot just multiply by 10e8, round and divide by 10e8 because I don't know if it will be e-8 or e-45 or anything else.

So basically I want to be able to obtain the 1.5000002 part, apply toFixed(3) and put back the exponent part.

I could convert into a string and parse but it just doesn't seem right...

Any idea ?


(I apologize in advance if you feel this is one of many duplicates, but I could not find a similar question, only related ones)

Gael

Gabriel S.
  • 1,767
  • 1
  • 17
  • 29

2 Answers2

12

You can use the toPrecision method:

var a = 15 * 1e-9;
a.toPrecision(2); // "1.5e-8"
Christian C. Salvadó
  • 723,813
  • 173
  • 899
  • 828
  • 1
    This, as documented, gives you a (typeof a ==) "string"; great for output. If you want to get a "number" back you can do `var b = 1 * a.toPrecision(2);` Beware of rounding in the middle of a computation. – Stephen P Jan 28 '11 at 17:21
  • 2
    @Stephen, yes, or `var b = +a.toPrecision(2);` or `var b = Number(a.toPrecision(2));` – Christian C. Salvadó Jan 28 '11 at 17:29
  • Wasn't expecting an easy solution ! I shall look deeper into documentation next time ! – Gabriel S. Jan 28 '11 at 17:55
0

If you're doing scientific work and need to round with significant figures in mind: Rounding to an arbitrary number of significant digits

Community
  • 1
  • 1
Ates Goral
  • 126,894
  • 24
  • 129
  • 188