1. ホーム
  2. スクリプト・コラム
  3. リナックスシェル

Linuxで科学的記数法(e)を数値に変換する。

2022-02-09 18:12:03

科学的記数法では、値を識別するためにeを使用します。科学的記数法を数値に変換する際の考え方は、eの右側の数だけ小数点以下の桁数を移動させることです。eの右側の数が負の場合は、小数点を左に移動させます。例を挙げると次のようになる。

1.2345678e2 = 123.45678
1.2345678e-2 = 0.012345678
1.7615562e+06 = 1761556.2
1.87982e7 = 18798200
1e3 = 1000


では、シェルで科学的記数法を数値に変換するにはどうすればよいのでしょうか。ここでは、"1.7615562e+06"(または1.7615562e6)の例を見てみましょう。

[root@kevin ~]# echo "1.7615562e6"| gawk '$1=strtonum($1)'
1.76156e+06

1)科学的記数法から10進法

[root@kevin ~]# printf "%f" 1.7615569e+06
1761556.900000
 
[root@kevin ~]# echo "1.7615569e+06"| awk '{printf("%f",$0)}' 
1761556.900000
 
[root@kevin ~]# echo "1.7615569e+03"| awk '{printf("%f",$0)}'
1761.556900
 
[root@kevin ~]# echo "1.7615569e+04"| awk '{printf("%f",$0)}'
17615.569000
 
[root@kevin ~]# echo "1.7615569e-6"| awk '{printf("%f",$0)}'
0.000002
 
[root@kevin ~]# echo "1.7615569e-4"| awk '{printf("%f",$0)}'
0.000176
 
[root@kevin ~]# echo "1.7615569e-3"| awk '{printf("%f",$0)}'
0.001762
 
[root@kevin ~]# echo "1.7615569e-2"| awk '{printf("%f",$0)}'
0.017616

注)この方式では、変換結果の小数点以下はすべて6桁に保持されます。
1) eの後の数値が正の数であれば、小数点以下6桁を保持し、足りなければ0を使用して補う。
2) eの後の数が負の数の場合、小数点以下6桁を確保し、それ以上の場合はこの時点で四捨五入して6桁にします。

2) 科学的記数法を10進数に変換し、小数点以下2桁を保持する。

[root@kevin ~]# echo "1.7615569e+06"| awk '{printf("%.2f",$0)}'  
1761556.90


小数点以下3桁を保持する

[root@kevin ~]# echo "1.7615569e+06"| awk '{printf("%.3f",$0)}'  
1761556.900

3)科学的記数法の10進数と丸め方

[root@kevin ~]# echo "1.7615569e+06"|awk '{printf("%d",$0)}' 
1761556
 
[root@kevin ~]# echo "1.7615569e3"|awk '{printf("%d",$0)}'  
1761
 
[root@kevin ~]# echo "1.7615569e02"|awk '{printf("%d",$0)}' 
176

4)科学的記数法の10進数への変換と小数点以下の四捨五入

[root@kevin ~]# echo "1.7615569e+06"| awk '{printf("%d",$0+0.5)}' 
1761557
 
[root@kevin ~]# echo "1.7615563e+06"| awk '{printf("%d",$0+0.5)}' 
1761556

5)小数点以下の無駄なゼロを削除する方法、参考になりますよ。デイリーオペレーションズの 文字列を傍受するシェルスクリプト 変数展開を使用した

[root@kevin ~]# echo "1.7615569e+06"| awk '{printf("%f",$0)}'
1761556.900000
 
[root@kevin ~]# var=$(echo "1.7615569e+06"| awk '{printf("%f",$0)}')
[root@kevin ~]# echo ${var%%0*}
1761556.9


または、sedメソッドを使用することもできます

[root@kevin ~]# echo "1.7615569e+06"| awk '{printf("%f",$0)}'   
1761556.900000
 
[root@kevin ~]# var=$(echo "1.7615569e+06"| awk '{printf("%f",$0)}')
[root@kevin ~]# echo "$var"|sed 's/0*$//'
1761556.9
 
[root@kevin ~]# echo "1.7615569e+06"| awk '{printf("%f",$0)}'| sed 's/0*$//'
1761556.9

6) 小数点以下の文字を削除するsed

[root@kevin ~]# echo "kevin.123"|sed "s/\. *//g"
kevin123
 
\... * stands for 1 to many after the decimal point
[root@kevin ~]# echo "kevin.123"|sed "s/\... *//g"
kevin
 
 
[root@kevin ~]# echo "kevin_123"|sed "s/\_*//g"
kevin123
 
[root@kevin ~]# echo "kevin_123"|sed "s/\_. *//g"
kevin

コマンドの説明です。
* は0から倍までを表します。だから... * は小数点をNULLに置き換えるだけです。にも同じことが言えます。
. *は1対多を表します。だから... * 小数点以下は削除されます。\_... *♪♪~同じことです。

7)シェルで数字を計算する手順

 1) bc method
bc is the more commonly used linux calculation tool, and it supports floating point operations.
[root@kevin ~]# a=`echo 1+1 | bc`
[root@kevin ~]# echo $a
2
 
This method can't solve the precision problem of floating-point operations, and the following floating-point cases are silly!
[root@kevin ~]# a=`echo 1+1 | bc`
[root@kevin ~]# echo $a
2
[root@kevin ~]# b=`echo "1.2*1.2" | bc`
[root@kevin ~]# echo $b
1.4
[root@kevin ~]# c=`echo "5.0/3.0" | bc`
[root@kevin ~]# echo $c
1
[root@kevin ~]# d=`echo "scale=2;5.0/3.0" | bc`
[root@kevin ~]# echo $d
1.66
[root@kevin ~]# e=`echo "scale=2;5.0/6.0" | bc`
[root@kevin ~]# echo $e
.83
 
2) expr method
It doesn't support floating point calculations, which is a pitfall, and you should pay attention to the spaces in the numbers and operators.
[root@kevin ~]# a=`expr 1+1`
[root@kevin ~]# echo $a
1+1
[root@kevin ~]# a=`expr 1 + 1`
[root@kevin ~]# echo $a
2
[root@kevin ~]# b=`expr 10 / 2`
[root@kevin ~]# echo $b
5
 
3) $(()) method
Same as expr, does not support floating point operations
[root@kevin ~]# a=$((1+1))
[root@kevin ~]# echo $a
2
[root@kevin ~]# b=$((1 + 3 ))
[root@kevin ~]# echo $b
4
 
4) let method
does not support floating point operations, and does not support direct output, only assignment
[root@kevin ~]# let a=1+1
[root@kevin ~]# echo $a
2
[root@kevin ~]# let b=50/5
[root@kevin ~]# echo $b
10
[root@kevin ~]# let c=1.2*2
-bash: let: c=1.2*2: syntax error: invalid arithmetic operator (error token is ".2*2")
 
5) awk methods
Ordinary arithmetic.
[root@kevin ~]# a=`echo | awk '{print 1.0/2.0}'`
[root@kevin ~]# echo $a
0.5
 
Control precision.
[root@kevin ~]# b=`echo | awk '{printf("%.2f",1.0/2.0)}'`
[root@kevin ~]# echo $b
0.50
 
Passing parameters.
[root@kevin ~]# c=`echo | awk -v a=1 -v b=3 '{printf("%.4f",a/b)}'`
[root@kevin ~]# echo $c
0.3333
 
awk combined with BEGIN (keep 6 digits after the decimal point)
[root@ss-server ~]# awk 'BEGIN{printf "%.2f%%%\n",(87/500)*100}'
17.40%
[root@ss-server ~]# awk 'BEGIN{printf "%.2f%%\n",(100/300)*100}'
33.33%

バランスよく考えると、awk のアプローチは今でも最も信頼性が高く、他のすべてのアプローチには対応する問題があります。ですから、日々のメンテナンスの場面で数学の計算をいじるには awk を使うことをお勧めします。

Linuxで科学的記数法(e)を数値に変換する方法についての記事は以上となります。Linuxのeを数字に変換する方法については、スクリプトハウスの過去記事を検索するか、以下の記事を引き続きご覧ください。