乙個日常 Excel 公式引發的思考

2021-09-22 20:23:12 字數 4138 閱讀 6057

偶爾有朋友諮詢我excel公式問題,其實平日用得不多,就熟悉幾個簡單的函式。只是多數問題通過分解,是可以通過簡單的函式實現的。

以有效投標人平均價為基準價,每超出基準價1%扣0.5分,低於基準價10%以後,每1%扣0.5分。總分25分,扣至零分為止,不計負分。超過最高投標限價的為無效投標。

舉例來說就是比如基準價100萬,然後我報了110萬就每1%扣0.5 就是扣5分;如果報了80萬,就是超過10%的每1%扣0.5分,也是扣5分。

形成乙個最終的公式可以分為四個步驟:

(1)問題轉換

問題轉換,就是重新描述一下,以便問題的計算過程更具體化。不同的轉換描述,會形成不同的公式表達。

(2)分解

將問題分解為乙個個的中間項,就像計算一道數學題的中間步驟一樣。複雜的公式不便記憶又難於理解,有效的分解,是把任務交給簡單函式的前提。

(3)表達對映

分解的項,使用函式來進行表達。我把這稱為表達對映,往往一些問題就可以用某類特定函式來表達,只是往往我們的表述會影響函式的選擇。如後邊後用到的min函式,它本義是取集合中的最小值,但計算值不大於某個特定值時就可以用它來表達。

(4)整合

把分解項形成的小公式,整合到一起,形成乙個顯得高大上的公式,就是需要的終極公式。

問題可理解為:根據投標價與基準價的百分比,100%以上的部分和 90%以下的部分每1個百分點扣0.5分,扣完(最多扣25分)為止。

如下圖,我們通過分解的方式把每個值分開計算:

逐項選擇合適的函式形成每一項的小公式

a.取百分比:投標價/基準價*100,對於小數部分經確認不到1% 的不算,那就要採用小學數學中的去尾法,只保留整數,使用int取整函式。

此時公式為:

b.高於100多少,用剛才計算的結果減掉100即可,但結果不能小於0。可做以下函式對映:

不小於某數 => 即跟某數比取其大(總是不會取到比某數小的) => max(計算值, 某數)

則 b 的公式為:

c.低於90多少,與b項同理,用90來減去計算的百分比即可,同樣結果不能小於0

則c的公式為:

=max( 90 - c2, 0 )
d.開始扣分,高的低的該扣分的百分比都計算出來了,0.5分1個百分點

則d的公式為:

e.最終扣分,不大於25分

不大於某數 => 即跟某數比取其小(總是不會取到比某數大的) => min(計算值, 某數)

則e的公式為:

= min( f2, 25 )
根據上述分解,我們得到以下分解公式

c2 = int( b2 / a2 * 100 )

d2 = max( c2 - 100, 0 )

e2 = max( 90 - c2, 0 )

f2 = d2 * 0.5 + e2 * 0.5

g2 = min( f2, 25 )

使用代入法集成為乙個公式:

c2 = int( b2 / a2 * 100 )

d2 = max( int( b2 / a2 * 100 ) - 100, 0 )

e2 = max ( 90 - int( b2 / a2 * 100 ), 0 )

f2 = max( int( b2 / a2 * 100 ) - 100, 0 ) * 0.5 + max( 90 - int( b2 / a2 * 100 ), 0 ) * 0.5

g2 = min( max( int( b2 / a2 * 100 ) - 100, 0 ) * 0.5 + max( 90 - int( b2 / a2 * 100), 0 ) * 0.5, 25)

最終公式即為:

顯然不同的問題轉換與分解,不同的表達對映會有不同的結果。

1.a 取得百分比

公式為:

=int( b2 / a2 * 100 )
1.b取得扣分百分比點數如果百分比大於100,則減100,

否則,如果百分比小於90,則用90減百分比,其餘則為0

函式對映 => if(大於100嗎?, 是的:百分比-100, 不是的:屬於100以內的情況)

100以內的情況公式=> if(小於90嗎?, 是的:90-百分比, 不是的:0)

得:=if(int(b2/a2100)<90, 90-int(b2/a2100), 0)

公式為:

=if(int(b2/a2*100)>100, int(b2/a2*100)-100, if(int(b2/a2*100)<90, 90-int(b2/a2*100), 0))
1.c 再乘0.5公式為:

=if(int(b2/a2*100)>100, int(b2/a2*100)-100, if(int(b2/a2*100)<90, 90-int(b2/a2*100), 0)) * 0.5
1.d扣分不超過 25 分最終公式為:

=min(25, if(int(b2/a2*100)>100, int(b2/a2*100)-100, if(int(b2/a2*100)<90, 90-int(b2/a2*100), 0)) * 0.5)
2.a 統一扣分半徑扣分與不扣分的中間段為 90 至 100,取其中點 95,這樣在中點兩邊,不扣分都佔5個百分點,取百分比到這個中間點的距離,即(百分比– 95)的絕對值

公式為:

=abs(int(b2/a2*100) - 95)
2.b 得到要扣分的點數用該絕對值再減去不扣分的5,即得到要扣分的點數。為負數則在不扣分的範圍內,由下一步去處理。

公式為:

=abs(int(b2/a2*100) - 95) – 5
2.c 用2.b的計算值 * 0.5,但不小於0先使用2.b的計算值 * 0.5,然後有如前面介紹的函式對映,使用max函式表達不小於0

=max((abs(int(b2/a2*100) - 95)-5) * 0.5, 0)
2.d 扣分不超過25分有如前面介紹的函式對映,使用min函式表達不大於25

最終公式為:

=min(max((abs(int(b2/a2*100) - 95)-5) * 0.5, 0),25)

乙個memset引發的血案

前幾天做了一道bst題,提交了幾次都是wa,今天抽空拿了出來仔細瞧瞧總算被我發現禍頭根源.總結原因還在於自己對memset不太了解,以前用對估計也是瞎貓撞見死耗子 memset的介紹 void memset void buffer,int ch,size t count buffer 指向某段記憶體...

乙個分號引發的「血案」

再多的表情也無法詮釋我現在的心情!a b for matrices 這是很水的一道題,然而卻整整折騰了我2個多小時。從晚上6點多開始,花了沒幾分鐘就把 敲好了,可是資料一測,竟然不對,然後就開始找問題,找了很久,我竟然都還沒看出問題在哪,越找心裡越不爽,這麼做明明對的呀,一執行怎麼就錯了呢?一直到了...

乙個軟體引發的崩潰

今天筆記本正常重啟後,出現 c000021a unknown hard error 的錯誤。無論是安全模式,命令列模式都無法正常登入系統,重視出現以上錯誤。看到這個錯誤貌似由於硬體錯誤,第乙個反應會不會是磁碟壞道,分析一下似乎又不是,搜尋也有遇到這種情況,但情況各不相同。沒有太多精力去分析原因,還好...