答案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
以获得更好的结果。
该网站解释了根本问题:
每个程序员都应该了解的浮点运算知识