c# - Javascript flyttalproblem - Avrundningsproblem?


Jag har ett problem med mitt klientsidesskript som inte beräknar samma värden som min serversideskod:

Till exempel:

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

Detta ger en siffra på 0,28500000000000003

Men min serversideskod (C#) beräknar en siffra på 0,285 som när den avrundas till 2 decimaler blir 0,28

Om jag försöker avrunda 0,28500000000000003 till 2 decimaler får jag 0,29.

Hur får jag min Javascript att skapa en figur som matchar min server-sidans kod.

Det ser ut som att jag måste gå igenom två omgångar avrundning - först för att ta bort den avslutande 3:an, sedan avrundningen till de önskade decimalerna.

Till exempel:

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

Är detta den bästa lösningen?

(detta är en omformulering av en fråga jag öppnade och raderade tidigare)

Svar #1

.Net använder bankiravräkning. Om ett tal är vid avrundningsmittpunkten, t.ex. 2,5, avrundas talet till närmaste jämna tal, i detta fall 2. Avrundning på detta sätt eliminerar snedvridningen som introduceras genom att alltid avrunda uppåt.

Du kan använda bankers avrundning i JavaScript med hjälp av koden på http://snippets.dzone.com/posts/show/1305.

Svar #2

Din C#-kod använder bas 10-decimaltypen som som standard använder bankiravrundning. Javascript-koden använder bas 2-flyttalsaritmetik. Dessa två former av datoraritmetik kommer i grunden att ge olika resultat. Lösningen måste vara att använda samma aritmetiska metoder i båda koderna.