- 論壇徽章:
- 0
|
本帖最后由 jils2013 于 2012-06-15 11:12 編輯
應該是sprintf()和類型轉(zhuǎn)化的問題
因為轉(zhuǎn)化類型為d,所以按照數(shù)字來處理;--我猜可能是處理的數(shù)字大小限制(或者長度限制)
改轉(zhuǎn)化類型為s,即可避免開始的問題
以下是幾個簡化的測試- [root@localhost ~]# echo "" | awk '{print sprintf("%020s","100111101010111111");}'
- 00100111101010111111
- [root@localhost ~]# echo "" | awk '{print sprintf("%020d","100111101010111111");}'
- 00100111101010111104
- [root@localhost ~]# echo "" | awk '{print sprintf("%020d","10011110101011111111");}'
- 10011110101011111936
- [root@localhost ~]# echo "" | awk '{print sprintf("%020s","10011110101011111111");}'
- 10011110101011111111
- [root@localhost ~]# echo "" | awk '{print sprintf("%030d","100111101010111111110");}'
- 00000000000000000001.00111e+20
- [root@localhost ~]# echo "" | awk '{print sprintf("%030s","100111101010111111110");}'
- 000000000100111101010111111110
復制代碼 最開始問題的改進后- [root@localhost ~]# echo "" | awk 'function binary(num)
- {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%02s",str)}
- END\
- {print binary(1624958878)}'
- 1100000110110101110011110011110
- [root@localhost ~]# echo "" | awk 'function binary(num)
- {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%02s",str)}
- END\
- {print binary(162495)}'
- 100111101010111111
復制代碼 所以,問題的結(jié)論個人認為應該是awk處理數(shù)字的精度問題,這也可以解釋,最開始的問題:處理小數(shù)字沒有問題,處理大數(shù)字時缺出現(xiàn)問題;
sprintf()d的解釋:
d, i 接受整數(shù)值并將它轉(zhuǎn)換為有符號的十進制符號表示法。精度指定顯示的最小數(shù)字位數(shù)。如果值轉(zhuǎn)換后可以用更少的位數(shù)來表示,將使用前導零擴展。缺省精度是 1。精度為零的零值轉(zhuǎn)換的結(jié)果是空字符串。用零作為前導字符來指定字段寬度,導致用前導零填充字段寬度值。
也就是說,我們把一個2進制20多位的數(shù)字字符串傳遞給sprintf時,他會按照這個數(shù)字時十進制去處理,應該是很大的數(shù)字了
-- 開始的問題
前幾天用 awk 的 一個十進制和二進制轉(zhuǎn)換的自定以的函數(shù),較小的數(shù)字沒有問題;
數(shù)字大點的,就會莫名其妙的打印問題:用print 加變量可以正常打印,但是如果直接print 加上函數(shù)執(zhí)行 打印的數(shù)字和正常的小一點;
平臺是rhel 5.4- [root@localhost shell]# awk --version
- GNU Awk 3.1.5
- [root@localhost shell]# echo "" | awk 'function binary(num)
- {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
- END\
- {binary(162495);print str}'
- 100111101010111111
- [root@localhost shell]# echo "" | awk 'function binary(num)
- {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
- END\
- {print binary(162495)}'
- 100111101010111104
- [root@localhost shell]# echo "" | awk 'function binary(num)
- {str="";while(num!=0){str=num%2str;num=int(num/2);};return sprintf("%0d",str)}
- END\
- {print binary(16249)}'
- 11111101111001
復制代碼 |
|