Oracle
 sql >> Database >  >> RDS >> Oracle

Comprensione del comportamento della funzione resto() in Oracle

Le stesse persone che hanno scritto la documentazione (che sembrano non ricordare alcune definizioni dall'aritmetica) sembrano insicure su ciò che hanno scritto. Da un lato, all'inizio della spiegazione menzionano ROUND - ma poi quando danno una definizione più formale dicono

"Intero più vicino" non è formalmente definito in aritmetica, e in effetti è consentito usare quel nome per round(x) tranne quando la parte frazionaria di x è esattamente 0,5, nel qual caso "intero più vicino" è ambiguo e si può scegliere di usa "arrotonda per difetto" come propria definizione di "intero più vicino".

Non arrabbiarti troppo con tali incongruenze nella documentazione, se puoi. Ne vedrai molti di più.

Tuttavia :Ciò che è MOLTO peggio è che il comportamento è incoerente. Uso Oracle 12.1 e sulla mia macchina ho appena provato e ottengo

remainder(10, 4) =  2
remainder( 6, 4) = -2

Nessuna rima o ragione. Molto meglio fare la tua divisione, usando FLOOR e simili.

Modifica - O forse c'è qualche motivo; forse usano una definizione di "intero più vicino" per indicare, in caso di parità, il pari più vicino numero intero. Continuando a produrre risultati inaspettati, è meglio non utilizzare la funzione REMAINDER() di Oracle.