2009-07-29 16 views
5

Il problema è questo, quando aggiungo due o più doppi da una tabella a una vista, invece di darmi i risultati corretti, aggiunge circa una decina di cifre in più. Ad esempio 0.5 + 1.5 = 1.99999999998 o 5.5 + 8.5 = 14.0000000001. Qualche idea? (So che questa è una specie di domanda n00b e mi ricordo di dover affrontare cose del genere negli esami del 9 ° grado, ma non riesco a ricordare come ho fatto allora: P)Problemi di calcolo Mysql: 1 + 1 = 1.999999999

+0

Che cosa stai chiedendo esattamente? Vuoi sapere perché questo comportamento si verifica? O vuoi solo fornire i risultati corretti? – Velociraptors

+7

Questa è la domanda standard in virgola mobile. Cerca SO per [virgola mobile] per oltre 100 domande simili. Uno di quelli può aiutarti. –

+2

il mio insegnante di matematica del liceo ci ha detto che .9999 ... = 1, quindi non vedo quale sia il tuo problema? :) – Jason

risposta

2

Non aspettatevi numeri interi quando lavori con i tipi a virgola mobile.

+2

mi piacerebbe andare così lontano come a dire: "Se non si conosce la destinazione dei tipi in virgola mobile, non li usano." E "tenere traccia dei centesimi" o "aggiungere una cifra decimale" non è lo scopo previsto. – quillbreaker

3

This article spiega abbastanza bene il problema.

In breve, numeri in virgola mobile molto grandi o molto piccoli possono causare una perdita di precisione durante i calcoli.

2

Non sono sicuro se siete alla ricerca di una spiegazione o una soluzione, ma dal momento che hai già ottenuto puntatori a buone spiegazioni ....

Se avete bisogno dei vostri numeri per comportarsi come numeri interi, utilizzare numeri interi. Se hai bisogno di un grado finito di precisione (cioè due cifre decimali, per i campi che rappresentano denaro), memorizzalo comunque come un numero intero, ma moltiplicalo per qualsiasi fattore di 10 necessario per eliminare il decimale quando lo inserisci il database e dividere per lo stesso quando lo si tira fuori.

Quindi se si rappresenta un widget che costa $ 3,99, si inserisce 399 nel campo WIDGET.cost.

Non so se questo si applica alla vostra situazione o no. Ma la regola generale è che i numeri in virgola mobile sono SEMPRE semplici approssimazioni. :-) Se la precisione conta, trova un modo per usare interi.

8

Aggiunta 1 e 1 come galleggianti o doppie non dovrebbe comportare tutt'altro 2.

Trovo difficile credere che 0.5 + 1.5 esce a tutto tranne 2.

Tutti questi numeri possono essere rappresentato correttamente in virgola mobile.

Odio dire che non credo nei tuoi esempi, ma non lo credo. :-)

Tuttavia, credo che potresti avere problemi con un numero come 1.1.

Perché? Perché 1/10 risulta essere un decimale ricorrente in binario.

Il problema si presenta quando si tenta di convertire numeri in virgola mobile tra rappresentazioni decimali e binarie. Alcuni numeri rendono il viaggio eccellente, ma altri sono solo approssimativi.


Tuttavia, se i tuoi esempi funzionano davvero così, non ho idea di cosa stia succedendo e mi piacerebbe saperlo.

+0

in effetti si, gli esempi sono solo esempi. Il vero problema include molte SUM da tabelle diverse e penso che non sarebbe di grande aiuto per postare l'intero processo ... – Ant

+5

Lo sapevo! I tuoi esempi hanno l'odore dell'autenticità solo fino a quando non li ho davvero prestati attenzione. Quindi ti do +1 per fare il furto con successo. Puoi dire che i SO hanno visto domande simili così tante volte che non li leggiamo più. :-) – Nosredna

4

numeri in virgola mobile sono SEMPRE semplici approssimazioni. :-) Se la precisione conta, trova un modo per usare interi.

Nella mia esperienza, quando ho usato il tipo di dati decimale invece di float/double, ho sempre ottenuto i risultati precisi.

Problemi correlati