答案1
差異在於gawk
手動的狀態:
二進制浮點表示和算術是不精確的。像這樣的簡單值
0.1
無法使用二進制浮點數精確表示,且浮點數的有限精度意味著運算順序或中間儲存精度的輕微變化都可能改變結果。更糟的是,對於任意精確度浮點運算,您可以在開始計算之前設定精確度,但您無法確定最終結果中有效小數位數。
gawk
是 GNU awk
。它支持-M
:
-M --bignum
選擇數字的任意精度算術。如果
gawk
未編譯為使用 GNU MPFR 和 MP 函式庫,則此選項無效。
您awk
可能相當於也可能不相當於gawk
.在我的 Debian 9 中,以下兩個指令都會產生25396577843.76
:
LC_NUMERIC=C gawk -M -v PREC=60 -F '"?\\|"?' '{T+=$(2)*1000} END {printf "%.2f\n",T/1000}' demofile.txt
LC_NUMERIC=C gawk -M -v PREC=60 -F '"?\\|"?' '{T+=$(2)} END {printf "%.2f\n",T}' demofile.txt
雖然printf "%.4f\n",T
我還是看得出差別。增加PREC
以獲得更好的結果。
該網站解釋了根本問題:
每個程式設計師都應該了解的浮點運算知識