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.