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