Newsgroup: it.comp.software.database
Titolo: Tipi float in SQL Server

Ciao a tutti, sono nuovo di questo ng, e ho subito una bella domanda :
ho una tabella
chiamata "decimali"
con campi
[float] di tipo float
[real] di tipo real
[decimal] di tipo decimal
[money] di tipo money
Perchè facendo :
insert into decimali
(float, real, decimal,money)
values
(25.8, 25.8, 25.8, 25.8)
io ho che nei campi ho questi valori
[float] = 25.800000000000001
[real] = 25.799999
[decimal] = 26
[money] = 25.8000
solo il campo di tipo money mantiene esattamente il campo così come lo
inserisco !!!! PERCHE' ?!?!?
E poi... perchè nel campo decimal lui si fa l'arrotondamento e non mi dà un
bell'errore di type mismatch ?
Grazie mille a tutti

 PERCHE' ?!?!?
Dipende da come il valore viene gestito dal sistema interno.
Davide

 [money] = 25.8000
beh, intanto se i primi due sono detti "approssimati" ci sarà una
ragione? ;)
Hanno due usi differenti (infatti io i primi non li suo mai e ne so
poco). Con i primi cerchi di mantenere la massima precisione possibile a
livello binario sulla tua macchina, l'esempio giusto è: 1/3. I secondi
sono quelli che memorizzano i numeri "business" come nel tuo esempio
dove però ritengo tu abbia dimenticato la scala sul decimal che _non_
deve arrotondare in questo contesto
Anche qui io non uso money,so solo che puoi avere max 4 decimali per il
resto credo sia mero spazio in memoria. il money è 4 e 8 mentre il
numeric è più dinamico da 5 a (se ricordo bene 17 e ti rimando all'msdn

Rispondo a Paolo e a Davide...
Io capisco che possa dipendere dal sistema interno.....
Per fare chiarezza mi devo rifare a quanto ha innescato le prove oggetto del
mio primo post :
Io prendo un valore float da un mio programma Delphi che vi accede via ODBC
(e qui forse avevo omesso un particolare importante, chiedo scusa), e lo
arrotondo all'intero superiore; come faccio ? :
prendo il numero, vi sommo 0,9 e ne prendo la parte intera.
Bene direte voi, insomma dico io, perchè (caso prova , che poi è quello che
mi è successo) :
-l'utente scrive 187,10
-update sulla tabella : il valore salvato (campo di tipo float) è
187,0999999999....
-lo ripesco tramite select
-faccio il mio arrotondamento per eccesso eeeee... ZACCHETE!!!!  :
    il numero che avrei dovuto avere arrotondando per eccesso all'intero
superiore 187,10 sarebbe 188, e invece no! se sommo 187,099999999... + 0,9
ottengo 187.999999....la cui parte intera è 188 !!!!
Cavolo!!! non va bene!!!! io ho letto la documentazione dei tipi float ma e
dice che approssimano... ma :
se io ti scrivo 187,123463874684845686545435687 posso capire che sulla
n-sima cifra decimale possa starci una imprecisione, ma cavolo se io ti
scrivo 187,10 te al massimo mi ci devi scrivere 187,100000000000000000 !!!
Non capisco ancora... sono un po' duro?

 numeric è più dinamico da 5 a (se ricordo bene 17 e ti rimando all'msdn
ma allora tu se non usi float, real e money, cosa usi? Numeric?
Grazie della tua pazienza, CIAOUX

 In che senso?
Ciao hi-info,
I datatype real e float sono utilizzati per memorizzare dati numerici
*approssimati* per definizione (ed introducono di conseguenza degli errori
di approssimazione), mentre se intendi memorizzare delle valute č necessario
utilizzare un datatype che permetta di definire il numero preciso di cifre
decimali.
Ti consiglio di ricorrere al datatype decimal (o il suo sinonimo numeric) e
giocare con gli argomenti precision e scale in base al numero di decimali
richiesti ed al massimo importo che vuoi memorizzare.
Se il numero di decimali č fisso a 4, puoi utilizzare anche i datatype money
e smallmoney.
Prova a leggere il seguente paragrafo dei Books Online e tutti gli altri
linkati a fine pagina:
"Numeric Data" URL:createdb.chm::/cm_8_des_04_82ic.htm
(incolla l'URL nella dialog box che appare selezionando il menu Go, URL...).
Ciao!
-- 
Lorenzo Benaglia
Microsoft MVP - SQL Server
UGIdotNET - 
http://www.ugidotnet.org
UGISS - 
http://www.ugiss.org

 Io prendo un valore float da un mio programma
morta li. non usare i float
ciao
P.S. quando ho scritto scale intendevo il parametro (in inglese) "scale"
di sqlserver ovvero il numero di decimali