Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Javascript floating point problem - Rounding issue?

Tags:

javascript

c#

I have a problem with my client side script not calculating the same values as my server side code:

For example:

var x = (2.85 * .1);
alert(x);

This gives a figure of 0.28500000000000003

However my server side code (C#) calculates a figures of 0.285 which when rounded to 2 decimal places gives 0.28

If I try and round 0.28500000000000003 to 2 decimal places I get 0.29.

How do I get my Javascript to create a figure that matches my server side code.

It looks like I have to go through 2 lots of rounding - firstly to remove the trailing 3, then the rounding to the required decimal places.

For example:

var x = 0.2850000000003;
x = parseFloat(x.toFixed(3))
x = x.toFixed(2)
alert(x);

Is this the best workaround?

(this is a re-wording of a question I opened and deleted earlier)

like image 936
FloatLeft Avatar asked Sep 01 '11 11:09

FloatLeft


2 Answers

.Net uses banker's rounding. If a number is at the rounding midpoint e.g. 2.5 then the number is rounded to the closest even number, in this case 2. Rounding in this manner eliminates the bias introduced by rounding upwards.

You can use bankers rounding in javascript using the snippet at http://snippets.dzone.com/posts/show/1305.

like image 197
detaylor Avatar answered Sep 21 '22 17:09

detaylor


Your C# code is using the base 10 decimal type which by default uses bankers rounding. The Javascript code uses base 2 floating point arithmetic. These two forms of computer arithmetic will inherently give different results. The solution must be to use the same arithmetic methods in both codes.

like image 30
David Heffernan Avatar answered Sep 22 '22 17:09

David Heffernan