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

时间:2014-10-09 15:37:25

标签: awk rounding

简短版本:

有没有办法告诉awk在合并期间舍入到2位小数,而不是在打印期间?

长版:

我有一个传入的文件,格式如下。我应该得到每种货币的净余额,如果净值不为零,则将结果打印在两列中:净余额小于零转到neg_bal列,正余额转到pos_bal列。出于某种原因,尽管净值为零,仍然会打印美元列

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|

以下是使用的代码:

#!/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
            }       
        }
    }

结果(注意JPY没有显示,因为它的网络为零):

awk]$ ./scr1 file1
EUR|-11.90|0.00
USD|0.00|0.00
GBP|0.00|80.00

如果我将小数位数增加到20,我看到美元净额实际上并非为零。 (为什么这样,顺便说一下?甚至excel给出净值-1.59872E-14)

awk]$ ./scr1 file1
EUR|-11.90000000000000213163|0.00000000000000000000
USD|0.00000000000000000000|0.00000000000001243450
GBP|0.00000000000000000000|80.00000000000000000000

1 个答案:

答案 0 :(得分:4)

  

有没有办法告诉awk在期间舍入到2位小数   合并,而不是在印刷过程中?

是:乘以100并转换为int。然后在准备打印时除以100。

(换句话说,算上便士而不是美元。)