Javascript float subtract

27,109

Solution 1

No, nothing wrong with your code, most decimal fractions cannot be represented exactly in binary, use

number.toFixed(x)

Where x is the number of decimals you want and number is the result of the subtraction.

Solution 2

Another possible solution might be this:

Number((-0.2-0.1).toFixed(x))

Where x should be the tolerance in decimals you'd like.

Running this with an x of 16, gives me an output of -0.3.

-0.3 === Number((-0.2-0.1).toFixed(16)) // true, and also with every 0 < x < 16

Let me know.

Solution 3

The reason of your problem is explained here: Why does modulus operator return fractional number in javascript?

A possible solution could be:

<script type="text/javascript">
var result = (-20-10)/100;
alert("My result is "+result);
</script>

Solution 4

You are doing nothing wrong, what you are seeing is the side effect of computers storing numbers in base 2. In base 10, 1/3 can't be precisely represented: .33333333 (with a bar over the 3). The same is true for 1/10 and 1/5 in base 2 or binary. The answer you see is merely the result of a rounding error. If you are working with money, it is often advised to just store values as cents to avoid some floating point errors.

As far as fixing the result you can do something like:

var SIGDIG= 100000000;
alert( Math.floor((-0.2-0.1)*SIGDIG)/SIGDIG );

Solution 5

toFixed() is what you must be looking for.

E.g

number.toFixed(x); 

where x is the number of digits after the decimal point. It is optional with default value of 0.

More here : Javascript Number.toFixed() Method

Share:
27,109
Teneff
Author by

Teneff

Fatal error: imagination limit exceeded

Updated on May 28, 2020

Comments

  • Teneff
    Teneff almost 4 years

    I was wondering how can I subtract two negative Floating-Point numbers in javascript. I tried:

    alert(-0.2-0.1);
    

    and the result is -0.30000000000000004. Am I doing something wrong? What do I have to do to get -0.3 ?

  • daalbert
    daalbert almost 13 years
    I don't like toFixed() because it will pad unwanted trailing 0s, see toFixed().
  • RonSper
    RonSper over 9 years
    Your answer is preposterous, how could this be a limitation with binary?
  • Taylan
    Taylan over 6 years
    An external resource for more explanation: floating-point-gui.de
  • Yash
    Yash over 2 years
    what if you not know how many decimal precisions you need. the subtraction results could vary.