章棣華
(鎮江市丹徒區宜瑞建筑工程質量檢測中心,江蘇 鎮江 212028)
在我國科學技術與生產活動中,因測試或計算會得出的各種各樣的數值,當所得數值需要修約時,應按《數值修約規則與極限數值的表示和判定》(GB/T 8170—2008)提出的一系列方法計算相關數據。日常的技術生產工作中,經常會面臨復雜的測試數據運算與分析問題。而當前所運用的電子表格軟件通常具備靈活的數據處理能力,可以非常方便快速地對大量數據進行運算、統計、分析,可以極大地提高工作效率。然而電子表格軟件中的進舍函數需要采取數值修約規則中的“四舍五入”方法進行計算分析,不符合本文所研究的數值修約規則,因此不免會帶來額外的修約誤差。目前主流電子表格軟件有Microsoft Excel 和WPS 電子表格。本文主要研究了對數值進行修約的規則及其背后的數學原理,并以使用最廣泛的Microsoft Excel 為例(簡稱“Excel”),詳細給出了《數值修約規則與極限數值的表示和判定》數值修約規則在這個軟件中的實現辦法。
數值修約可以理解為舍去一個數值的最后若干位數字,對最末位數字進行保留處理。經過一系列處理之后,最后所得到的值會趨近于原本數值的過程,稱之為數值修約。其中,經數值修約處理后的數值,稱之為修約值。
修約間隔經常作為修約值最小數值單位存在。修約值是修約間隔的整數倍。
如指定修約間隔為0.1,修約值需要在0.1 的整倍數中大量選取,可以理解為將數值修約到具體一位小數。
如指定修約間隔為10,修約值需要在10 的整數倍中大量選取,可以理解為將數值修約到十位。
如指定修約間隔為0.5,修需要在0.5 的整數倍中大量選取,可以理解為將數值修約到具體一位小數。需要注意的是,該小數位必須能夠被5 整除。
《數值修約規則與極限數值的表示和判定》的數值修約進舍規則并不等同于傳統的四舍五入方法,而是需要結合具體情況選擇不同的規則進行計算處理。
規則一。如果擬舍棄數字的最左一位數字<5,則將擬舍棄數字全部舍去,保留的其余各位數字不變。
例1,將10.349 修約到一位小數,得10.3。
規則二。如果擬舍棄數字的最左一位數字>5,則將該位數需要進一處理,也就是需要對保留的末位數字進行加1 處理。
例2,將12.60 修約到個位,得13。
規則三。如果擬舍棄數字的最左一位數字=5,同時其后有非0 數字時進一,那么則就需要對所保留的末位數字進行加1 處理。
例3,將10.501 修約到個數位,計算結果為11。
規則四。如果擬舍棄數字的最左一位數字=5,而右面無數字/皆為0 時,若所保留的末位數字屬于奇數領域范疇,則需要進一處理,相反則舍棄。
例4,將11.500 修約到個數位,計算結果為12。
例5,將10.500 修約到個數位,計算結果為10。
規則五。針對負數的修約處理需要關注其的絕對值,絕對值需要按照規則1~4 修約處理,經過處理之后,需要在所得值前面加上“-”(負號)。
例6,將-10.500 修約到個數位,得-10。
規則六。0.5 單位修約與0.2 單位修約等非整數位修約,先將修約間隔乘以數值X 換算到整數修約間隔Y,對擬修約數值和X 的積依規則一至四,按修約間隔Y 進行修約,最后將所得數值再除以X。
例7,將10.25 修約到個數位的0.5 單位,先將10.25×2=20.5,再依規則一至四修約到個數位得20,最后20÷2=10.0。
《數值修約規則與極限數值的表示和判定》數值修約規則的數學本質上是為了在測量精度有限時,使正負誤差期望絕對值相等,相互抵消后確保舍棄和進位區間在統計意義上均等,因此適用于科研、生產活動中測量、統計等不可避免存在測量誤差的數據處理[1]。
對于精確的解析計算,或者原始數據都是整數或離散數值(且計算過程沒有精度損失的)的計算中,“四舍五入”是完全不存在任何問題的,反而使用“四舍六入”會出現系統誤差。
例如,由于精度受限,實際情況下,5 左右狹窄區域內的測量數據都會被讀作5.00,“四舍五入”時進位,導致系統誤差的產生,“四舍五入”誤差期望概率分布圖如圖1 所示,數據精度有限時,“四舍五入”法舍棄區間和進位區間概率分布不相等,解決的辦法就是按GB/T 8170—2008 規定的數值修約規則,對5 附近的數據概率相等地進位或舍棄,以消除系統誤差。

圖1 “四舍五入”誤差期望概率分布
如要求保留某個測量讀數1.2500 到小數點后一位。該讀數即使精確到了0.0001,仍然無法確定該數的真值是略小于讀數(如1.249998),還是略大于讀數(如1.250002)。因為這兩個數如此接近于1.2500,當測量精度不夠時把它們讀成1.2500 是無法避免的。因此如果對于1.2500,無論其真值比1.2500 小一點點還是大一點點,我們都當作1.25 使用“五入”規則進位到1.3,那么就產生了系統誤差[2]。雖然這個誤差在很多場景下似乎并不算大,但隨著數據的累積,誤差最終一定會被放大到不可接受的程度。因此在這種情況下,采取《數值修約規則與極限數值的表示和判定》數值修約規則這種平均概率處理能夠在統計上抵消誤差。
如果對于上例,總能精確地測量出真值是1.249998或1.250002,那么就完全不需要《數值修約規則與極限數值的表示和判定》數值修約的算法,“四舍五入”是完全正確的。但是對于測量[3]而言,真值是一個理想概念,一般來說,真值不可能確切獲知。
例8,某商品住宅房基樁單樁豎向抗壓靜載試驗項目,設計樁型(PHC-400(95)AB-C80)。其中,單樁豎向抗壓極限承載力控制設計為1300kN,檢測方法采取慢速維持荷載法,規范標準按照《建筑地基基礎設計規范》(GB 50007—2011)執行。
試驗的沉降相對穩定標準:每級荷載作用下的樁的沉降量連續兩次在每小時內小于0.1mm,(從分級荷載施加后的第30min 開始,按1.5h 連續三次每30min的沉降觀測值計算),認為已經達到相對穩定,可施加下一級荷載。
130kN 這一級最后1h 實測平均沉降如按照“四舍五入”應為“0.10mm”,試驗的沉降未達到相對穩定標準,應繼續本級加載試驗,直至試驗的沉降達到相對穩定標準,但根據《數值修約規則與極限數值的表示和判定》數值修約的算法130kN 這一級最后1 小時實測平均沉降應為“0.09mm”,試驗的沉降達到相對穩定標準,所以對于檢測檢驗而言,數據的修約尤其重要,它關系的試驗的準確性及科學性,乃至試驗成功與否。基樁單樁豎向抗壓靜載試驗130kN 數據匯總表具體數值如表1 所示。

表1 某商品住宅房基樁單樁豎向抗壓靜載試驗130kN 數據匯總
Excel 中自帶的舍入函數,常用的為ROUND 函數,在數值修約上更適用于“四舍五入”規則,當擬舍棄數字的最左一位數字為5,而右面無數字/皆為0 時,計算結果會出現明顯偏差,不符合《數值修約規則與極限數值的表示和判定》修約結果。同時,Excel 中自帶的舍入函數也不符合相關規則的修約間隔,如無法實現0.5 單位和0.2 單位的修約間隔。
例9,將10.25 修約到0.1 單位,以Excel 中的自帶舍入函數為操作方法:ROUND(12.25,1)=12.3,結果出現偏差。
計算機中因為數據存儲的進制問題,還帶來其他誤差。計算機中的數據是按照二級制存儲的,有的小數以二進制存儲時先天存在誤差。如十進制數0.1 轉換成二進制后,會變成0.0011001100…(1100 循環)這樣的無限循環小數。就和無法用十進制數來表示1/3 是一樣的道理。1/3 用十進制表示就是0.3333…,同樣是無限循環小數。這樣計算時不免帶來誤差。計算機雖然是功能強大,但是無法處理無限小數,Excel 對此采用浮點數表示,根據變量數據類型所對應的長度將數值從中截斷或者四舍五入。將0.333…這樣的循環小數從中間截斷會變成.33333,這時它的3 倍就無法得出1(結果是0.99999),計算機因為無法正確表示的數值,最后都變成了近似值,在需要精確計算的時候,就帶來了誤差。
Excel 自帶函數本身存在局限性,無法完全實現數值修約功能,再加上其小數數值存儲誤差問題明顯,最終計算結果精確度難以得到保障。這里利用Excel 中自帶VBA 編程自定義一個數字修約函數實現GB/T 8170—2008 數值修約規則。下面我們就以Microsoft Excel 2010 為例,利用Microsoft Visual Basic(以下簡稱VBA)[4]來編制一個符合《數值修約規則與極限數值的表示和判定》的自定義數據修約函數(函數名:gbt8170)。
第一步,選擇菜單“開發工具、按下鍵盤Alt+F11 組合鍵、選中命令指示、打開VBA 窗口、自定義函數。
第二步,進入VBA[5]窗口后,選擇菜單“插入→模塊"命令、獲取“模塊1”,在“模塊1”中輸入自定義函數代碼,如下所示:
Public Function gbt8170(ByVal x As Double, ByVal n As Single) As Double
Dim a As Single
p = 1
If x < 0 Then
p = -1
x = x * p
End If
a = x / n - Int(x / n)
If a > 0 And a < 0.5 Then
gbt8170 = p * Int(x / n) * n
ElseIf a = 0.5 Then
If Int(x / n) Mod 2 = 0 Then
gbt8170 = p * Int(x / n) * n
Else
gbt8170 = p * Int(x / n + 1) * n
End If
Else
gbt8170 = p * Int(x / n + 1) * n
End If
End Function
注:a 的數據類型須設置成single 格式,不然會出錯。
第三步,函數自定義成功后,選擇菜單中的文件功能,點擊關閉并返回到Microsoft Excel 命令,退回到Excel 工作表窗口界面當中。完成上述一系列操作后,可以在Excel 里面選擇gbt8170 函數調用。自定義gbt8170 函數用法:gbt8170(待修約值,修約間隔)[6]。
Excel 舍入函數ROUND 和自定義函數gbt8170 比較如表2 所示,函數gbt8170 對各種不同類型的數值修約都能滿足標準的要求,而自帶的函數ROUND,對有些末尾是偶數的修約數值就開始出錯了,而且對復雜一些的0.5 修約也不能直接使用。

表2 Excel 舍入函數ROUND 和自定義函數gbt8170 比較
綜上所述,利用Microsoft Excel VB 編程方式比較符合《數值修約規則與極限數值的表示和判定》數值修約規則要求,不僅比較容易實現,使用起來也方便,就算不懂計算機編程,操作人員只要輸入自定義函數后,每次使用時只要調用gbt8170 函數,就可以實現正常操作,可滿足科學技術和生產活動中大多數需要數據計算處理的日常工作。