我在一個bash腳本上工作,並希望將一個始終爲整數的輸入值轉換爲科學記數法。 例如,當我使用printf「%E」時,300的值將被轉換爲3.00E + 02。原則上這是有道理的,但我需要特殊的格式0.300E + 03。我沒有找到解決這個問題的方法。 感謝您的幫助。定義printf「%E」的格式
問候 黑爾格
我在一個bash腳本上工作,並希望將一個始終爲整數的輸入值轉換爲科學記數法。 例如,當我使用printf「%E」時,300的值將被轉換爲3.00E + 02。原則上這是有道理的,但我需要特殊的格式0.300E + 03。我沒有找到解決這個問題的方法。 感謝您的幫助。定義printf「%E」的格式
問候 黑爾格
一個粗魯的方式,剛上手...... 警告:這個作品只是爲了你的榜樣,用尾數和指數正:
#!/bin/sh
theval=$(printf "%4.2E" "$1") # 200 -> 2.00E+02
# we want 0. 20 E+03
mantissa=${theval%E*}
echo "mantissa1=$mantissa" # 2.00
mantissa="0.${mantissa:0:1}${mantissa:2:1}"
echo "mantissa2=$mantissa"
exp=${theval#*+}
let exp=exp+1
exp=$(printf "%2.2d" $exp)
echo "Result=${mantissa}E+$exp"
運行此腳本產量:
/tmp$ ./exp.sh 200
mantissa1=2.00
mantissa2=0.20
Result=0.20E+03
從man 3 printf
,重點煤礦:
e, E
double參數是圓形的,並在風格轉換[-]d.ddde±dd
其中存在小數點字符和的位數後它是等於精度之前的一個數字;如果精度丟失,則取6;如果精度爲零,則不會出現小數點字符。 E轉換使用字母E(而不是e)來引入指數。指數總是包含至少兩位數;如果值爲零,則指數爲00.
如果您想要0到1之間的尾數,則需要構建自己的格式化程序。以下是awk
中的一個示例。手柄0和底片:
function sn() {
awk -vn=$1 'BEGIN {
split(n,a,"E");
if (0 < a[1]) { m=a[1]/10; e=a[2]+1; p=length(a[1])-1; }
else if (a[1] < 0) { m=a[1]/10; e=a[2]+1; p=length(a[1])-2; }
else { m=0; e=0; p=length(a[1])-2; }
printf "%0.*fE%+03d", p, m, e;
}'
}
使用像:
sn $(printf "%4.2E" -0.024)
感謝您的答案。 原則上它的工作原理,但是當我有一個像3180這樣的數字時,只是數字的第一個字段,3被認爲是,而不是初始數字的其餘部分。我將嘗試找出定義字段數的代碼部分。
問候 黑爾格
我想我的答案與3180,和它的作品幾乎相當。 _你上面的答案應該是作爲評論發佈的,而不是答案。 – linuxfan