Come calcolare idealmente il margine di profitto con zero vendite

0

Come gestisci il seguente scenario senza null?

Hai questo problema (in Java):

BigDecimal sales = ...;
BigDecimal cost = ...;
BigDecimal profit = sales.subtract(cost);
// Profit Margin = profit / sales
BigDecimal profitMargin = profit.divide(sales, 20, RoundingMode.HALF_UP);

Poiché sales a volte è zero, trasformiamo l'ultima riga in:

BigDecimal profitMargin = sales.compareTo(BigDecimal.ZERO) == 0 ? null : profit.divide(sales, 20, RoundingMode.HALF_UP);

In questo caso se profitMargin == null , allora sappiamo cosa significa. Se rendi profitMargin = 0, questo non è proprio corretto, né è infinity un buon valore. Sembra meglio che rimanga indefinito . Eppure, è una "bomba inesplosa". Quindi, qual è il modo migliore per gestirlo?

Queste domande come originariamente poste su Stack Overflow, e mi hanno anche indirizzato alla domanda I riferimenti null sono davvero una brutta cosa?

    
posta ryvantage 21.06.2014 - 05:22
fonte

4 risposte

8

Se le vendite sono pari a zero, il margine di profitto è zero.

Zero è un risultato perfettamente valido per sostituire il risultato indefinito di un calcolo di divisione per zero in molti casi ed evita l'uso di null a meno che tu non voglia specificamente conoscere il caso di vendita pari a zero.

    
risposta data 21.06.2014 - 06:01
fonte
6

Non chiederci! Non siamo noi a prendere decisioni aziendali in base all'output dei tuoi calcoli!

Detto questo, gli sviluppatori devono sapere come affrontare queste situazioni. Nella mia esperienza, i dilemmi come questo rientrano in due ampi scenari:

  1. Ciò accade relativamente spesso e gli utenti aziendali vedranno l'output basato su vendite di $ 0,00 su base regolare.

  2. Questo è un caso d'angolo che accade molto raramente. È così raro che gli utenti aziendali abbiano difficoltà a ricordare "l'ultima volta" che è successo. Quando succede, la sua non crisi aziendale.

Per lo scenario n. 1, vorrei andare dagli utenti aziendali e chiedere loro quale margine di profitto% vogliono vedere per le vendite di $ 0,00.

Per lo scenario n. 2, probabilmente non vale la pena perdere tempo dagli utenti aziendali per scoprire cosa vogliono vedere. Lo imposterei in qualcosa che minimo potrebbe dare una falsa impressione, probabilmente lo 0%. Secondo me, usare un numero come il 20% darebbe la falsa impressione che si stiano facendo soldi. Non prendere una decisione autonomamente a meno che non si abbia familiarità con gli utenti e gli affari. In caso di dubbio, consulta gli utenti aziendali.

    
risposta data 21.06.2014 - 19:51
fonte
1

La risposta @Robert richiede che sia possibile utilizzare un margine di profitto pari a 0 se le vendite sono pari a 0 o avere la possibilità in un secondo momento di accedere alle vendite per verificare se sono 0 prima di utilizzare il margine di profitto. Se questo è il caso, allora la sua risposta è accettabile.

Se tuttavia è necessario sapere se il margine di profitto è 'NaN' in una fase di elaborazione futura, un altro approccio sarebbe quello di estendere BigDecimal in modo che il fatto che le vendite fossero 0 quando si tenta di calcolarlo è preservato.

Sarebbe il mio approccio preferito per estendere BigDecimal e creare una nuova classe per il margine di profitto indipendentemente dal fatto che la correttezza del tipo migliorata rende i programmi più facili da comprendere e da mantenere.

    
risposta data 21.06.2014 - 10:27
fonte
1

My question is: how do you handle the following scenario without null?

Il modo in cui lo gestiresti su un bilancio (cioè è 0).

La matematica è un cattivo esempio di null. La matematica ha lavorato senza nullità per secoli, e non c'è mai un bilancio o un libro mastro generale o un libro di matematica per bambini che dice "nulla".

La programmazione aveva il problema di cosa assegnare a una variabile per la quale la memoria non era ancora stata assegnata, ed è qui che nacque il valore nullo. Forse hai bisogno di trovare un altro esempio di null (e ne troverai molti), ma sicuramente non di matematica: -)

    
risposta data 21.06.2014 - 12:45
fonte

Leggi altre domande sui tag