2017-02-11 91 views
1

我试图做一些简单的数学在AWK数学在AWK - 浮点数的意外格式化 - 精密

[email protected]:~$ awk '{ram=(1.8 * 1024) * 1024; print ram}' 

1.88744e+06 

所以,我认为,这意味着,这个数字太大,存储在丢失变量 “RAM”

总数为:1887436.8

允许尝试存储在变量

[email protected]:~$ awk '{ram=1887436.8; print ram}' 

1.88744e+06 
该号码

同样。但是如果我们摆脱了“。”呢?

[email protected]:~$ awk '{ram=18874368; print ram}' 

18874368 

进一步的实验表明,当点是多少,它不能超过6个位数

[email protected]:~$ awk '{ram=188743.68; print ram}' 

188744 

所以它不是一个过大的数字,它是食堂的事情了点。我怎样才能解决这个问题?

+0

谢谢!原来我的问题确实是那个问题的重复。 – Johnathan

回答

2

你可以控制的printf小数点的数量,但最终的数字将不会显著由于浮点表示

例如

awk 'BEGIN{for(i=5;i<20;i++) printf "%."i"f\n", 1./3}' 

0.33333 
0.333333 
0.3333333 
0.33333333 
0.333333333 
0.3333333333 
0.33333333333 
0.333333333333 
0.3333333333333 
0.33333333333333 
0.333333333333333 
0.3333333333333333 
0.33333333333333331 
0.333333333333333315 
0.3333333333333333148 
2

为了补充karakfa's helpful answer

明确数字格式与printfsprintf,您还可以更改awk默认浮点数格式化,通过内置变量OFMT
请注意,它确实不是适用于整数

OFMT默认为%.6g,这意味着任何浮点数被舍入到6个显著位数和用于开始7科学记数法来表示指数。

计算结果1887436.8 - 其具有显著数字 - 因此被表示为1.88744e+06,即,与6位显著科学记数法。

下面的例子,以默认设置OFMT%1.f输出与1位小数所有浮点数字:

$ awk -v OFMT='%.1f' 'BEGIN {ram=(1.8 * 1024) * 1024; print ram}' 
1887436.8 

但是请注意,这OFMT适用于以下情况:

  • 如果浮点数是在字符串连接使用:

    $ awk -v OFMT='%.1f' 'BEGIN { print "result: " 1/3 }' 
    result: 0.333333 
    
    # Workaround: Use `sprintf()` with OFMT 
    awk -v OFMT='%.1f' 'BEGIN { print "result: " sprintf(OFMT, 1/3) }' 
    result: 0.3 
    
  • 如果一个文字可能是解析整数 - 即使它看起来像一个浮点数:

    $ awk -v OFMT='%.1f' 'BEGIN { print 1.000 }' 
    1 
    

买者:有在awk的数字转换和格式化方面有很多细微之处,这不仅仅是因为有限的公关浮点数(在awk中始终为ISO C double类型)。