[MySQL] SUM() geeft 9.9500000476837 ipv 9,95

Pagina: 1
Acties:

  • Maarten21
  • Registratie: Juli 2003
  • Laatst online: 11-05 11:58
Ik wil met SUM() de som van een bepaalde kolom in een tabel uitrekenen:
code:
1
SELECT SUM(kolom) AS totaal FROM tabel


nu staan er in die kolom maar 3 waardes die groter dan 0 zijn:
3 en 3 en 3,95
verder zijn er een stuk of tien 0en
je zou zeggen dat de uitkomst 3+3+3.95(+10*0) = 9.95 is.
Er wordt echter 9.9500000476837 gegeven...
Ik kan dit vast wel afronden enzo, maar 't zou prettig zijn als dat niet nodig zou zijn.

Heeft iemand een idee waarom deze uitkomst wordt gegeven en hoe ik dit kan oplossen?

Alvast bedankt!

  • Bartjuh
  • Registratie: Oktober 2001
  • Niet online

Bartjuh

Hej

Volgens mij heeft dit met de precisie te maken...

Je moet een ander soort datatype maken van die kolom...
Wat heb je nu dan?

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 21:24

NMe

Quia Ego Sic Dico.

Welke versie van MySQL gebruik je? En welk veldtype? Ik heb je fout proberen te reproduceren door een tabel te maken met een veld dat 10 keer de waarde 0 heeft, en twee keer de waarde 3 en nog een keer de waarde 3,95, maar ik krijg gewoon netjes 9,95 als output terug. Ik heb een DOUBLE veld gebruikt.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Maarten21
  • Registratie: Juli 2003
  • Laatst online: 11-05 11:58
hij stond inderdaad op float!
Ik heb 'm nu veranderd naar double, maar hij geeft nog steeds 9.9500000476837...

te vreemd...

edit:
MySQL versie 3.23.58

[ Voor 14% gewijzigd door Maarten21 op 11-12-2004 12:49 ]


  • Cavorka
  • Registratie: April 2003
  • Laatst online: 27-03-2018

Cavorka

Internet Entrepreneur

Table opnieuw maken > waardes inserten > nogmaals SUM'en.

Welke versie van MySQL gebruik je? *Edit: Oud enzo. B)

[ Voor 56% gewijzigd door Cavorka op 11-12-2004 12:50 ]

the-blueprints.com - The largest free blueprint collection on the internet: 50000+ drawings.


Verwijderd

Ik denk dat het niet zozeer iets te maken heeft met de database.

Ik heb dit ook nog tegengekomen op een Oracle database in een pl/sql applicatie.
Waarschijnlijk heeft het idd iets te maken met datatypes.

  • Maarten21
  • Registratie: Juli 2003
  • Laatst online: 11-05 11:58
Cavorka schreef op zaterdag 11 december 2004 @ 12:49:

Welke versie van MySQL gebruik je? *Edit: Oud enzo. B)
Klopt, maar het is helaas niet aan mij om 't up te daten... :(

  • Bartjuh
  • Registratie: Oktober 2001
  • Niet online

Bartjuh

Hej

Ik kan me nog iets herinneren in C#... ik had een for loopje, en bij elke ronde verhoogde ik een double met 0.1 , je zou verwachten dat je dan 0.1 , 0.2 , 0.3 en verder krijgt ...
maar na de 11 ging het opeens van 11.999999999 , 12.9999999 , 13.999999 :?

Heel raar, heb telkens maar opgelost met Math.round en dan 1 decimaal... maar toch raar :?

  • Maarten21
  • Registratie: Juli 2003
  • Laatst online: 11-05 11:58
Cavorka schreef op zaterdag 11 december 2004 @ 12:49:
Table opnieuw maken > waardes inserten > nogmaals SUM'en.
Heb dit gedaan en 't werkt! Thanks!

[ Voor 6% gewijzigd door Maarten21 op 11-12-2004 13:00 ]


  • mbravenboer
  • Registratie: Januari 2000
  • Laatst online: 06-11-2025
Je gebruikt het verkeerde type voor je kolom. Zowel double als float gebruiken floating point berekeningen, wat niet overeenkomt met de manier waarop wij normaal gesproken rekenen met komma getallen. De echte oplossing is om het DECIMAL type te gebruiken. Uit de manual:
The DECIMAL and NUMERIC types are implemented as the same type by MySQL. They are used to store values for which it is important to preserve exact precision, for example with monetary data. When declaring a column of one of these types, the precision and scale can be (and usually is) specified;
Iemand noemt nog C#, daar is er gelukkig ook nog een 'decimal' type, wat hetzelfde doel heeft. Dit onderwerp is al vaak besproken in P&W, dus misschien dat je moet zoeken nog wat meer achtegrond informatie kan vinden.

Blog, Stratego/XT: Program Transformation, SDF: Syntax Definition, Nix: Software Deployment


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 09-04 22:08
Met decimal red je het nog niet altijd; (1/3)*3 is niet altijd 1.00000 maar vaak 0.9999... Je moet je realiseren dat je met eindige precisie rekent.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 15-05 06:45
Het gaat hier om sommeren (optellen); dan is decimal wel een geschikt type. Natuurlijk kun je dan nog niet met derdes rekenen, maar dat hoeft vaak ook niet.

Verwijderd

ik kan me nog een artikel herrineren van 2 jaar terug in De Stem. Hierin stond dat er een fout zat in een reeks Intel processors. Zo zou je bij de som (1/123456789)*123456789 geen 1 meer krijgen, maar 1.000000000xxxxxxx... Misschien ligt het aan je proc dus
Pagina: 1