科学计数法使用e标识数值,将科学计算学转化为数字的思路:按e右边的数字移动小数点位数。e右边的数字如果是负数,则向左移动小数点。示例如下:
1.2345678e2 = 123.456781.2345678e-2 = 0.0123456781.7615562e+06 = 1761556.21.87982e7 = 187982001e3 = 1000
那么在shell中,如何转化科学计数法为数字呢,方法如下:这里以'1.7615562e+06' (或者1.7615562e6)为示例:
[root@kevin ~]# echo '1.7615562e6'| gawk ’$1=strtonum($1)’1.76156e+06
1)科学计数法转为十进制
[root@kevin ~]# printf '%f' 1.7615569e+061761556.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)科学计数法转为十进制并保留两位小数
[root@kevin ~]# echo '1.7615569e+06'| awk ’{printf('%.2f',$0)}’ 1761556.90
保留三位小数
[root@kevin ~]# echo '1.7615569e+06'| awk ’{printf('%.3f',$0)}’ 1761556.900
3)科学计数法转为十进制并取整
[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)科学计数法转十进制并四舍五入取整
[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)如何将小数点后无用的0去掉, 可以参考: 日常运维的Shell脚本中截取字符串的做法,即用变量扩展的方式
[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 ..*代表了小数点之后的1到多个[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到多个。故.*只能替换掉小数点变成空。_*同理。.*代表1到多个。故..*将小数点后的全部去掉了。_.*同理。
7)shell中的数字计算说明
1)bc方法bc是比较常用的linux计算工具了,而且支持浮点运算:[root@kevin ~]# a=`echo 1+1 | bc`[root@kevin ~]# echo $a2 这种方法没法解决浮点数运算的精度问题,如下几种浮点数计算情况就傻X了![root@kevin ~]# a=`echo 1+1 | bc`[root@kevin ~]# echo $a2[root@kevin ~]# b=`echo '1.2*1.2' | bc`[root@kevin ~]# echo $b1.4[root@kevin ~]# c=`echo '5.0/3.0' | bc`[root@kevin ~]# echo $c1[root@kevin ~]# d=`echo 'scale=2;5.0/3.0' | bc`[root@kevin ~]# echo $d1.66[root@kevin ~]# e=`echo 'scale=2;5.0/6.0' | bc`[root@kevin ~]# echo $e.83 2)expr方法不支持浮点数计算,这是个坑,而且要注意数字与运算符中的空格。[root@kevin ~]# a=`expr 1+1`[root@kevin ~]# echo $a1+1[root@kevin ~]# a=`expr 1 + 1`[root@kevin ~]# echo $a2[root@kevin ~]# b=`expr 10 / 2`[root@kevin ~]# echo $b5 3)$(())方法同expr,不支持浮点数运算[root@kevin ~]# a=$((1+1))[root@kevin ~]# echo $a2[root@kevin ~]# b=$((1 + 3 ))[root@kevin ~]# echo $b4 4)let方法不支持浮点数运算,而且不支持直接输出,只能赋值[root@kevin ~]# let a=1+1[root@kevin ~]# echo $a2[root@kevin ~]# let b=50/5[root@kevin ~]# echo $b10[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方法普通的运算:[root@kevin ~]# a=`echo | awk ’{print 1.0/2.0}’`[root@kevin ~]# echo $a0.5 控制精度:[root@kevin ~]# b=`echo | awk ’{printf('%.2f',1.0/2.0)}’`[root@kevin ~]# echo $b0.50 传递参数:[root@kevin ~]# c=`echo | awk -v a=1 -v b=3 ’{printf('%.4f',a/b)}’`[root@kevin ~]# echo $c0.3333 awk结合BEGIN(小数点后面保留6位)[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转化为数字内容请搜索优爱好网以前的文章或继续浏览下面的相关文章希望大家以后多多支持优爱好网!
相关文章:
1. Win11右键没有压缩选项怎么办?Win11右键没有压缩选项的解决方法2. Win11开机后出现explorer.exe应用程序错误怎么解决? exe应用程序错误解决办法3. Win11发布预览版Build 22000.1639更新补丁KB5022905推送(附更新修复内容汇总)4. KB5022845导致Win1122H2更新驱动失败 Surface出现0x80070103错误5. win最稳定的版本推荐6. 为Win12让路:Win11 2023终极正式版来了7. 你没有权限在此位置中保存文件请与管理员联系以或得相应权限8. Win11 预览版25300怎么开启文件资源管理器图库隐藏功能?9. Win11 release preview通道是什么?release preview频道更新Win11好吗?10. Win11控制面板一直闪烁怎么回事?Win11控制面板打不开一直闪解决方法