2017-02-11 36 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類型)。