Problemer med desimaler i database

clinton4

Medlem
Hei,

Jeg har en database med kolonnen saldo (datatype varchar) som jeg skal trekke fra noen transaksjoner. Jeg opplever da problemer med at saldo får verdier med mange desimaler.

Feks:

Saldo = 500.00

Så kjører jeg:
UPDATE tbl SET saldo = saldo - 0.60 WHERE x = x LIMIT 1

Så blir saldo 499.4

Så kjører jeg enda en gang:
UPDATE tbl SET saldo = saldo - 0.60 WHERE x = x LIMIT 1

Så bli saldo 498.79999999999995

Hvorfor skjer dette? Jeg forventer at saldo skal være 498.8
 

clinton4

Medlem
Jeg vet jeg kan løse problemet med å endre datatype til desimal, så det jeg lurer på er egentlig hvorfor mysql slenger på alle disse desimalene når regnestykket egentlig går opp.
 

adeneo

Medlem
Ser mistenkelig ut som om du treffer på et problem med flytende punkt ?

Det finnes ikke tall i en datamaskin, alt lagres som flytende punkt (bits per byte osv), og det kan enkelte ganger føre til unøyaktighet ved kalkulasjoner. Løsningen er normalt å passe på at man jobber med integere der man forventer at det skal være integere, og at radix'en er riktig, ettersom octal ofte er standard enkelte steder.

For mer dyptgående om emnet anbefales det å lese :

What Every Computer Scientist Should Know About Floating-Point Arithmetic

Du kan forøvrig bruke casting direkte hvis ikke jeg husker feil :

Kode:
UPDATE tbl SET saldo = saldo - CAST(0.60 as decimal) WHERE x = x LIMIT 1
 
Sist redigert:

adeneo

Medlem
Det ble kanskje litt teknisk men det er ikke så mange måter å forklare det på?

Her er en demonstrasjon med javascript som viser litt av problemet, det er jo selvfølgelig ikke sikkert problemet her er det samme, men det ser mistenkelig sånn ut.

Ettersom dette er noe som skjer på grunn av måten tall lagres i datamaskinen, så oppstår dette problemet i alle språk, enten det er PHP, javascript, C eller SQL, så man kan egentlig treffe på denne rariteten med merkelige feil i avrunding av tall overalt (i en datamaskin).
 
Sist redigert:
Topp