[T-SQL] Round(float, 2) rond niet goed af.

Pagina: 1
Acties:

  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Hallo,

Ik heb het volgende statement
Transact-SQL:
1
2
3
SELECT ROUND(P.Waarde, 2) 
FROM TBL_Prijzen P 
WHERE P.ProductenId = 24


Waarde uit TBL_Prijzen is van het type FLOAT(8,53) en is dus gewoon een standaard float.
Enkele waardes in de database zijn:

1.25
2.75

10.99
12.99
11.99
56.95

0.99
0.99
etc...

De in vet gedrukte prijzen worden opgehaald met de SELECT, maar helaas geeft deze de volgende waardes terug:

1.25
2.75
11.99
56.950000000000003

Weet iemand hoe dit kan??

Om het geheel nog raarder te maken, wanneer ik dezelfde SELECT uitvoer, maar dan met ROUND(P.Waarde, 1), worden de volgende waardes terug gegeven.

1.3
2.7999999999999998
12.0
57.0

Wat heb ik al gedaan?
Wanneer deze SELECT in een VIEW wordt uitgevoerd gaat ie goed.
In een stored procedure (gegeven resultaten komen van de SP) geeft ie bovenstaande waardes terug.
Converteren van de waarde uit TBL_Prijzen naar bijvoorbeeld een VARCHAR zijn eigenlijk geen optie omdat je dan bij elke SELECT weer een CONVERT moet doen naar een FLOAT.

Wat ik nog niet heb uitgevoerd is om van het veld waarde in TBL_Prijzen een INT te maken en deze op te slaan*10 en bij het ophalen te delen door 10.
Niet helemaal een nette oplossing, dus vandaar ook mijn vraag hier.

Mbv google, GoT search, eXperts eXchange en de MSDN heb ik hier niet uit kunnen komen.

Alvast bedankt voor de hulp.

| Life is a game (and games are fun) | homepage |


  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

akakiwi schreef op 04 november 2003 @ 08:05:
Wat ik nog niet heb uitgevoerd is om van het veld waarde in TBL_Prijzen een INT te maken en deze op te slaan*10 en bij het ophalen te delen door 10.
Niet helemaal een nette oplossing, dus vandaar ook mijn vraag hier.
Wordt echter wel heel vaak gedaan. Wij lopen zelf ook vaak genoeg tegen problemen met valuta aan, en in een volgend ontwerp sla ik graag alles op in centen.

Maar waarom gebruik je float, en geen money of decimal :?

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


  • _js_
  • Registratie: Oktober 2002
  • Laatst online: 13-01 07:19
Floats worden binair opgeslagen, niet decimaal. Veel decimale fracties kunnen niet precies binair worden opgeslagen.

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
float is een datatype met een drijvende komma. Het getal wordt bij benadering opgeslagen, en moet je dus ook niet gebruiken voor prijzen. Het beste kun je gewoon zoals kenneth al zegt, decimal gebruiken.

(float gebruik je vooral in velden waarin hele grote en hele kleine waarden moeten worden opgeslagen)

Oops! Google Chrome could not find www.rijks%20museum.nl


  • akakiwi
  • Registratie: September 2000
  • Laatst online: 20-03 11:13

akakiwi

I believe in the ruling class.

Topicstarter
Wanneer ik het veld omzet naar DECIMAL, dan verlies ik alle waardes achter de komma.
Nogal wazig, maar ja.

Nu ik het veld van het type MONEY gemaakt heb, werkt het allemaal prima.
Stom van mezelf dat ik daar niet eerder aan gedacht heb.

Bedankt voor de hulp en wat mij betrefd mag ie nu gesloten worden.

| Life is a game (and games are fun) | homepage |


  • Glimi
  • Registratie: Augustus 2000
  • Niet online

Glimi

Designer Drugs

(overleden)
akakiwi een thread hoeft niet dicht als een bevredigend antwoord gegeven is. Dit omdat er niet zoiets is als 'het antwoord' bestaat en mensen misschien nog geniale ingevingen krijgen ;) Daarom laat ik hem open ok?

  • P_de_B
  • Registratie: Juli 2003
  • Niet online
akakiwi schreef op 04 november 2003 @ 09:01:
Wanneer ik het veld omzet naar DECIMAL, dan verlies ik alle waardes achter de komma.
Nogal wazig, maar ja.
dat komt omdat een decimal standaard geen cijfers achter de komma heeft als je deze niet specificeert.
Nu ik het veld van het type MONEY gemaakt heb, werkt het allemaal prima.
Stom van mezelf dat ik daar niet eerder aan gedacht heb.
Ik zou er echt een decimal van maken. Clientsoftware kan verschillend omgaan met MONEY. (en kan voor rare verassingen zorgen door bijv. een valuta teken ervoor te zetten dat je niet had bedoeld)

Oops! Google Chrome could not find www.rijks%20museum.nl

Pagina: 1