C'è una buona ragione per memorizzare percentuali inferiori a 1 come numeri maggiori di 1?

StackOverflow https://stackoverflow.com/questions/288575

  •  08-07-2019
  •  | 
  •  

Domanda

Ho ereditato un progetto che utilizza SQL Server 200x, in cui una colonna che memorizza un valore che è sempre considerato come una percentuale nel dominio problematico è memorizzata come equivalente maggiore di 1 decimale. Ad esempio, 70% (0,7, letteralmente) viene archiviato come 70 , 100% come 100 , ecc. A parte la necessità di ricordare di * 0,01 sui valori recuperati e * 100 prima di mantenere i valori, non sembra essere un problema in sé e per sé. Mi fa esplodere la testa però ... quindi c'è una buona ragione per cui mi manca? Ci sono validi motivi per risolverlo, dato che esiste una discreta quantità di codice scritto per funzionare con le pseudo-percentuali?

Ci sono alcuni casi in cui si verifica una percentuale superiore al 100%, ma non vedo perché il valore non debba essere archiviato come 1.05, ad esempio, in quei casi.

EDIT: la testa si sente meglio e leggermente più intelligente. Grazie per tutte le intuizioni.

È stato utile?

Soluzione

In realtà ci sono quattro buoni motivi a cui posso pensare che potresti voler memorizzare & # 8212; e calcolare con & # 8212; valori percentuali in numero intero anziché equivalenti in virgola mobile:

  1. A seconda dei tipi di dati scelti, il valore intero può occupare meno spazio.
  2. A seconda del tipo di dati, il valore in virgola mobile potrebbe perdere precisione (ricordare che non tutte le lingue hanno un tipo di dati equivalente al tipo decimal di SQL Server).
  3. Se il valore verrà immesso o inviato all'utente molto frequentemente, potrebbe essere più conveniente mantenerlo in un formato più user-friendly (decisione tra convertire quando si visualizza e convertire quando si calcola ... ma vedere il punto successivo).
  4. Se anche i valori di principio sono numeri interi,

    principle * integerPercentage / 100
    

    che utilizza tutta l'aritmetica dei numeri interi è generalmente più veloce del suo equivalente in virgola mobile (probabilmente significativamente nel caso di un tipo in virgola mobile equivalente al tipo <=> di T-SQL).

Altri suggerimenti

Se si tratta di un campo byte, occupa meno spazio nel db rispetto ai numeri in virgola mobile, ma se non si hanno milioni e milioni di record, difficilmente si noterà una differenza.

Dato che i valori in virgola mobile non possono essere confrontati per uguaglianza, potrebbe essere stato usato un numero intero per semplificare l'SQL.

Ad esempio

(0.3==3*.1)

è generalmente falso.

Tuttavia

abs( 0.3 - 3*.1 )

È un numero minuscolo (5,55e-17). Ma è doloroso dover fare tutto con (column-SomeValue) BETWEEN -0.0001 AND 0.0001 o ABS(column-SomeValue) < 0.0001. Preferiresti fare column = SomeValue nella tua clausola WHERE.

I numeri in virgola mobile sono soggetti a errori di arrotondamento e, pertanto, possono agire " funny " a confronto. Se vuoi sempre gestirlo come decimale fisso, puoi scegliere un tipo decimale, dire decimale (5,2), o fare la conversione e archiviare come int cosa che fa il tuo db. Probabilmente seguirei la via decimale, anche se l'int occuperebbe meno spazio.

Una buona ipotesi è perché tutto ciò che fai con i numeri interi (memorizzazione, calcolo, inserimento in una modifica per un utente, ecc.) è leggermente più semplice ed efficiente che fare lo stesso con numeri in virgola mobile. E i problemi di arrotondamento non sono così evidenti quando si guardano i dati.

Se si tratta di numeri che è probabile che gli utenti finali vedano e interagiscano, le percentuali sono più facili da comprendere rispetto ai decimali.

Questa è una di quelle situazioni in cui un aiuto alla notazione può aiutare; nel programma, essere coerenti nell'uso di un prefisso (ungherese) o postfisso per specificare valori che sono percentuali rispetto a quelli decimali. Se puoi estendere una convenzione di denominazione ai campi del database stessi, tanto meglio.

E per aggiungere al problema di archiviazione dei dati, se è possibile utilizzare l'aritmetica dei numeri interi per qualsiasi elaborazione si stia eseguendo, le prestazioni sono molto migliori rispetto a quando si esegue l'aritmetica in virgola mobile ... Quindi l'archiviazione delle percentuali come valori interi può consentire l'elaborazione logica per itilizzare l'aritmetica dei numeri interi

Se li stai effettivamente usando come coefficiente (o ti aspetti che gli utenti del database facciano questo tipo di cose nei rapporti), c'è un motivo per memorizzarli come coefficienti, in particolare se c'è un motivo per fare calcoli che coinvolgono più di uno.

Tuttavia, se lo fai, dovresti essere coerente - tutte le percentuali o tutti i coefficienti.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top