awk-在小计中舍入到小数点后2位

mas*_*erl 1 awk rounding

简洁版本:

有没有一种方法可以在合并过程中而不是在打印过程中告诉awk将其舍入到小数点后两位?

长版:

我有以下格式的传入文件。我应该获取每种货币的净余额,如果净值不为零,则将结果打印在两列中:小于零的净余额转到neg_bal列,而正余额转到pos_bal列。由于某些原因,尽管净额为零,USD列仍在打印

JPY||170
JPY||40
USD|-42.61|
USD|-166.27
USD||42.61|
GBP|-20|
EUR||18.7
USD||174.6|
USD|-8.33||
EUR|-30.6|
GBP||100
JPY|-210|
Run Code Online (Sandbox Code Playgroud)

这是我正在使用的代码:

#!/bin/awk -f
BEGIN {
    FS="|";
    }
    {
    bal[$1]+=$2+$3
    ccy[$1]=$1
    }
END {
    for (i in ccy)
        {
        if (bal[i] >0 )
        {
            pos_bal = bal[i]
            neg_bal = 0
        }
        else
        {
            neg_bal  = bal[i]
            pos_bal  = 0
        }
        if (bal[i] != 0 )
            {
                printf "%s|%.2f|%.2f\n",ccy[i],neg_bal,pos_bal
            }       
        }
    }
Run Code Online (Sandbox Code Playgroud)

结果(由于日元净值为零,因此未显示通知JPY):

awk]$ ./scr1 file1
EUR|-11.90|0.00
USD|0.00|0.00
GBP|0.00|80.00
Run Code Online (Sandbox Code Playgroud)

如果我将小数位增加为20,我会看到美元净额实际上不是零。(为什么会这样,顺便说一句?即使excel也给出了-1.59872E-14的净值)

awk]$ ./scr1 file1
EUR|-11.90000000000000213163|0.00000000000000000000
USD|0.00000000000000000000|0.00000000000001243450
GBP|0.00000000000000000000|80.00000000000000000000
Run Code Online (Sandbox Code Playgroud)

Nic*_*sso 5

有没有一种方法可以在合并过程中而不是在打印过程中告诉awk将其舍入到小数点后两位?

是:乘以100并转换为int。准备打印时,再除以100。

(换句话说,用几美分而不是美元计算。)