awk - 使用 awk 和 printf 没有正确舍入

标签 awk printf rounding

<分区>

我在使用 printf 将 float 四舍五入到正确的小数位数时遇到问题。我得到的结果不一致,如下所示。

echo 104.45   |  awk '{printf "%.1f\n",$1}'
104.5                               <-- seem to be correct behaviour

echo 104.445  |  awk '{printf "%.2f\n",$1}'
104.44       (should be 104.45)     <-- seems to be INCORRECT behaviour

echo 104.4445 |  awk '{printf "%.3f\n",$1}'
104.445                             <-- seems to be correct behaviour

我见过这样的例子,计算中的 float 可能会导致问题,但没想到格式化会出现这种情况。

最佳答案

数字 104.4445 不能精确表示为二进制数。换句话说,您的计算机不知道这样的数字。

# echo 104.4445 | awk '{printf "%.20f\n",$1}'
104.44450000000000500222

# echo 104.445 | awk '{printf "%.20f\n",$1}'
104.44499999999999317879

这就是为什么前者四舍五入为 104.445,而后者四舍五入为 104.44。

sjsam 的答案只与可以精确表示为二进制数 i 的数字有关。 e. m/2**n ,其中 mn 是整数并且不会太大。将 ROUNDINGMODE 更改为“A”对打印 104.45、104.445 或 104.4445 完全没有影响:

# echo 104.4445  |  awk -v ROUNDMODE="A" '{printf "%.3f\n",$1}'
104.445
# echo 104.4445 | awk '{printf "%.3f\n",$1}'
104.445
# echo 104.445 | awk -v ROUNDMODE="A" '{printf "%.2f\n",$1}'
104.44
# echo 104.445 | awk '{printf "%.2f\n",$1}'
104.44

关于awk - 使用 awk 和 printf 没有正确舍入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41083925/

相关文章:

c - printf 显示 "-858993460"或 "╠╠╠╠╠╠╠╠";这些是什么?

c - 转换说明符 `p` 与 `NULL` 指针的行为是什么?

java - 在Java中将double转换为整数

html - IE 中的 CSS 圆 Angular

c - 小数精度与 printf()、fprintf() 格式 %g 与 %f 中的位数

shell - AWK 拆分多个分隔线

linux - 如何在 awk 中转义 {}?

linux - awk - 列的一半大于 x 的所有行

php - GD 绘制带半径的矩形

regex - 检查目录是否存在递归地反转路径