2009-09-03 114 views
5

之間的百分比差異開始在這樣一個簡單的問題笑之前,讓我解釋一下:計算兩個值

我試圖確定有多少變化(百分比%)有超過各項指標的帳戶。這不是特別困難。但是,您通常如何處理當前值爲零或前一個值爲零的情況?

這個星期:收益= $ 25.6

上週:

If (CurrentValue > 0.0 && PreviousValue > 0.0) { 
    return (CurrentValue - PreviousValue)/PreviousValue; 
} return 0.0; 
:收益= $ 0.0

我目前由以下公式計算%的差異

如果前一週的收入爲零 - 差異應該是多少? + Infinity
而如果當前周爲零,反過來呢? -Infinity

然後的事情你怎麼會在LINQ到SQL查詢

Upside_Earnings = (statistics.Where(d => d.DateTime > first_startdate && d.DateTime <= first_enddate).Average(e => (double)e.Earnings) > zero && 
            statistics.Where(d => d.DateTime > second_startdate && d.DateTime <= second_enddate).Average(e => (double)e.Earnings) > zero) ? 
            ((statistics.Where(d => d.DateTime > first_startdate && d.DateTime <= first_enddate).Average(e => (double)e.Earnings) - 
            statistics.Where(d => d.DateTime > second_startdate && d.DateTime <= second_enddate).Average(e => (double)e.Earnings))/
            statistics.Where(d => d.DateTime > second_startdate && d.DateTime <= second_enddate).Average(e => (double)e.Earnings)) : zero, 
+0

感謝您的幫助男生/女生 – 2009-09-03 23:50:53

回答

5

在這種情況下做什麼是主觀的,可能取決於您的業務需求。

如果沒有其他選擇,我寧願不可用。

100%可能有意義。

也許使用1而不是零可能會在您的示例中導致2560%。

+0

好主意。 2560%對用戶來說可能更有意義。它允許各種零例子自行排序。 – 2009-09-03 23:50:08

1

我記得我的導師稱這是處理這種「不確定」,而不是無限複雜化。

wikipedia

司任何數目由零(其中除數是零)的沒有被定義。這是因爲零加到零,無論方程重複多少次,總是會導致零和。將這樣的等式輸入到大多數計算器中將導致發出錯誤消息。

+0

兩個值都爲零的位置 - 我很高興將差異稱爲零。這是其中一個值爲零的情況。 – 2009-09-03 23:41:04

+0

是的,我非常肯定它的未定義,x/0不是無窮大。 – Davis 2009-09-03 23:41:13

+0

對於分揀的目的,我認爲負面和正面的無限是更直觀的 – 2009-09-03 23:42:49

3

您可以任意設定%更改爲X,其中X是問題空間的合理默認值。然而,這不是一個真正的編程問題。這是你期望的問題。當任何數字接近零時,應該發生的事情是問題空間的一個函數。比如我曾經在一個會計「功能」上工作過一次。該函數沒什麼特別的,它只是將一種評分方法轉換爲代碼。問題在於評分方法,並且沒有人定義默認值是什麼,因爲一些分母變爲零。對於任何給定的會計分數,取決於所測量的細節,在零點發生的事情可能是滿分,部分分數或0分(按照分級標準)。

確定您正在測量的內容並將合理的默認值替換爲零。如果您正在測量性能,請確保有人不能通過有意在$ 0周之後以及高美元週數(例如)來遊戲系統。

+0

好點,我的情況統計不可能遭受任何篡改。 – 2009-09-03 23:46:34

1

我會存儲NaN或無窮大,或者任何有意義的值,但是當顯示給用戶時,我會將百分比留空或以某種方式指示百分比沒有意義。

+0

是的,這似乎是我的問題真正的問題 - 這是一個期望。當用戶按百分比差異對列表進行排序時,用戶期望什麼?無限有意義嗎?或者我應該減少到零? – 2009-09-03 23:48:27

0

雖然技術上答案要麼是未定義的(在$ 0/$ 0的情況下)或無窮大/ -infinity(所有其他情況),人類不會喜歡這兩種答案。如果我無法從用戶那裏瞭解什麼是最好的,我會展示類似的東西。

6

更改可以爲正值或負值。所以公式爲:

var change = ((V2 - V1)/Math.Abs(V1)) * 100; 

示例:從V1

  1. 計算百分比變化= 110到V2 = 220(正的變化)

[((V2 - V1)/ ((110-110)* 100) =(110/110)* 100] 1 * 100 = 100%變化

= 100%的增加

  • 計算百分比從V1 = 150至V2 = 75(負變化)
  • 變化[((V2 - V1)/ | V1 |)* 100]

    =((75 - 150)/ | 150 |)* 100 = (-75/150)* 100 = -0.5 * 100 = -50%變化

    =減少50%

    注意:這不處理零。你可以自己做