Avatar billede hyperactive Nybegynder
19. januar 2007 - 20:56 Der er 7 kommentarer og
1 løsning

Forkert nedrunding

Jeg har et problem med en stored procedure, som af en eller anden grund nedrunder værdien.

Feltet X i databasetabellen er af typen decimal(9,4)

Stored proceduren ser f.eks. sådan ud:

INSERT INTO TABEL(X) VALUES (@ValX/100)

Hvis jeg f.eks. sætter parametren @ValX til 875 og kører proceduren bliver værdien 8.0000 indsat i stedet for 8.7500...

Hvad er der galt?
Avatar billede erikjacobsen Ekspert
19. januar 2007 - 21:02 #1
Jeg kender ikke så meget til det men prøv
  INSERT INTO TABEL(X) VALUES (@ValX/100.0)
Avatar billede dr_chaos Nybegynder
19. januar 2007 - 21:40 #2
eller
INSERT INTO TABEL(X) VALUES (@ValX/CONVERT(decimal(9,4),100))
Under forudsætning af at @Valx er allerede en decimal.
Avatar billede bennytordrup Nybegynder
19. januar 2007 - 22:12 #3
Se på følgende eksempel:

declare @ValX int set @ValX = 875

select    (@ValX/100) as ValXAsInt, (Cast(@ValX as decimal(19,4))/100) as CastValXAsDecimal
Avatar billede hyperactive Nybegynder
19. januar 2007 - 22:52 #4
erikjacobsen... Din løsning fungerer fint... Er der nogen forklaring på dette... Rent matematisk burde x/100 jo være det samme som x/100.0... Men smid lige et svar så får du pointene
Avatar billede erikjacobsen Ekspert
19. januar 2007 - 23:16 #5
Hvem siger det skal være matematisk. Man kunne li'sågodt sige at en operation (her division) mellem 2 heltal skal give et heltal. Men når et af tallene er et "komma-tal", så bør det give et kommatal, gammelt trick med 100.0 - jeg kan ikke huske om jeg har brugt det i denne sammenhæng.

Jeg samler slet ikke på point, tak.
Avatar billede bennytordrup Nybegynder
21. januar 2007 - 10:47 #6
Problemet ligger ikke i, om du mener, der er forskel på 100 og 100.0 rent matematisk.
Problemet ligger i SQL Servers prioritering af datatyper. Int er den højest prioriterede datatype i SQL Server, og indgår flere datatyper i et statement, vil SQL Server forsøge at caste alle datatyper mod den højest prioriterede. Og din konstant 100 er en int, derfor vil SQL Server caste mod int.
Avatar billede hyperactive Nybegynder
21. januar 2007 - 10:52 #7
benny... Tak for forklaringen... :) Altid rart at vide, hvorfor tingene virker som de gør...
Avatar billede hyperactive Nybegynder
15. februar 2007 - 15:23 #8
Lukker
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester