Siamo bloccati con un database che (sfortunatamente) utilizza float anziché valori decimali. Questo rende l'arrotondamento un po 'difficile. Si consideri il seguente esempio (SQL Server T-SQL):"Mezzo round up" su valori in virgola mobile
SELECT ROUND(6.925e0, 2) --> returns 6.92
ROUND
fa round half up, ma dal momento che floating point numbers cannot accurately represent decimal numbers, viene visualizzato il risultato "sbagliato" (dal punto di vista dell'utente finale). Capisco perché questo accade.
ho già si avvicinò con due possibili soluzioni (sia di ritorno un galleggiante, che è, purtroppo, anche un requisito):
- convertire in un tipo di dati decimali prima di concludere:
SELECT CONVERT(float, ROUND(CONVERT(decimal(29,14), 6.925e0), 2))
- Multiply fino la terza cifra si trova sul lato sinistro del punto decimale (cioè con precisione rappresentati), e poi fare l'arrotondamento:
SELECT ROUND(6.925e0 * 1000, -1)/1000
Quale dovrei scegliere? C'è qualche soluzione migliore? (Purtroppo, non possiamo cambiare i tipi di campo del database a causa di alcune applicazioni legacy accesso alla stessa DB.)
Esiste un ben consolidato migliore soluzione pratica per questo problema (comune?)?
(Ovviamente, la tecnica comune "arrotondamento due volte" non aiuterà qui dal 6,925 è già arrotondato al terzo decimale - per quanto ciò è possibile in un galleggiante.)
Ho taggato questo sia 'sql-server' che' language-agnostic', poiché gli esempi sono in T-SQL ma la domanda per un algoritmo best-practice è generica. – Heinzi
Non esiste un algoritmo o una funzione che possa ottenere ciò che si vuole perché la maggior parte dei float che sono multipli di una base 10 non sono esattamente rappresentabili. Ad esempio, 6.925 è rappresentato come un valore leggermente sopra o sotto, ma mai esatto. In che modo vuoi che sia arrotondato? – hirschhornsalz