Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
awk-小计中四舍五入至小数点后2位_Awk_Rounding - Fatal编程技术网

awk-小计中四舍五入至小数点后2位

awk-小计中四舍五入至小数点后2位,awk,rounding,Awk,Rounding,简短版本: 有没有办法告诉awk在合并期间,而不是在打印期间,将小数点后两位四舍五入 长版本: 我有一个以下格式的传入文件。我应该得到每种货币的净余额,如果净余额不为零,则将结果打印在两列中:小于零的净余额转到负余额列,正余额转到正余额列。出于某种原因,尽管净值为零,美元栏仍在打印中 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|

简短版本:

有没有办法告诉awk在合并期间,而不是在打印期间,将小数点后两位四舍五入

长版本:

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

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
            }       
        }
    }
结果(请注意,由于日元等于零,因此不显示日元):

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

有没有办法让awk在测试过程中四舍五入到小数点后2位 合并,而不是在打印期间

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

(换句话说,数一分硬币而不是美元。)

有没有办法让awk在测试过程中四舍五入到小数点后2位 合并,而不是在打印期间

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

(换句话说,数一分钱而不是美元。)

wrt“这是为什么”——因为这是一个浮点计算,谷歌it。wrt“这是为什么”——因为这是一个浮点计算,谷歌it。
awk]$ ./scr1 file1
EUR|-11.90|0.00
USD|0.00|0.00
GBP|0.00|80.00
awk]$ ./scr1 file1
EUR|-11.90000000000000213163|0.00000000000000000000
USD|0.00000000000000000000|0.00000000000001243450
GBP|0.00000000000000000000|80.00000000000000000000