Awk realiza aritmética em números de ponto flutuante de precisão dupla. Eu não sei exatamente até que limite você obtém resultados exatos para números com dois decimais, mas você está no alcance. No entanto, este pode ser um problema se os números aumentarem . Se você precisa ter certeza de obter resultados exatos, fique com números inteiros e atente para o estouro, ou use bc
que executa aritmética de precisão arbitrária.
O problema aqui é que o awk está computando o resultado correto, mas o formato de impressão padrão é aproximado. Use um formato explícito ao imprimir o resultado.
export clm_total=$( awk -F'*' '{f1+=$3} END {printf "%.2f\n", f1}' datafile.dat)
Como alternativa, você pode ficar com print
, desde que altere o formato de impressão para converter números em strings. O padrão é %.6g
, o que resulta na aproximação que você está vendo.
export clm_total=$( awk -F'*' -v CONVFMT='%.2f' '{f1+=$3} END {print f1}' datafile.dat)