科学计数法使用e标识数值,将科学计算学转化为数字的思路:按e右边的数字移动小数点位数。e右边的数字如果是负数,则向左移动小数点。示例如下:

1.2345678e2 = 123.45678
1.2345678e-2 = 0.012345678
1.7615562e+06 = 1761556.2
1.87982e7 = 18798200
1e3 = 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+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)科学计数法转为十进制并保留两位小数

[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

《扩展1》                                                                                                                                                    
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

《扩展2》                                                                                                                                                    
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到多个。故\..*将小数点后的全部去掉了。\_.*同理。

《扩展3》                                                                                                                                                   
7)shell中的数字计算说明

1)bc方法
bc是比较常用的linux计算工具了,而且支持浮点运算:
[root@kevin ~]# a=`echo 1+1 | bc`
[root@kevin ~]# echo $a
2 这种方法没法解决浮点数运算的精度问题,如下几种浮点数计算情况就傻X了!
[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方法
不支持浮点数计算,这是个坑,而且要注意数字与运算符中的空格。
[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)$(())方法
同expr,不支持浮点数运算
[root@kevin ~]# a=$((1+1))
[root@kevin ~]# echo $a
2
[root@kevin ~]# b=$((1 + 3 ))
[root@kevin ~]# echo $b
4 4)let方法
不支持浮点数运算,而且不支持直接输出,只能赋值
[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方法
普通的运算:
[root@kevin ~]# a=`echo | awk '{print 1.0/2.0}'`
[root@kevin ~]# echo $a
0.5 控制精度:
[root@kevin ~]# b=`echo | awk '{printf("%.2f",1.0/2.0)}'`
[root@kevin ~]# echo $b
0.50 传递参数:
[root@kevin ~]# c=`echo | awk -v a=1 -v b=3 '{printf("%.4f",a/b)}'`
[root@kevin ~]# echo $c
0.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)转化为数字的方法 [shell中几种数字计算说明]的更多相关文章

  1. iOS 科学计数法保留N位有效数字

    iOS开发 项目中用到了将一个很大的数值转换成科学计数法的需求,转换成科学计数法的方式在iOS中其实是很好做的,使用NSNumber 的 kCFNumberFormatterScientificSty ...

  2. Java 科学计数法

    目录 Java 科学计数法 1 科学计数法的概念 1.1 有效数字 1.2 E记号 2 Java中的科学计数法 2.1 NumberFormat 2.2 DecimalFormat 2.3 BigDe ...

  3. C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现

      在C#中大家都会遇到这种情况 double类型的数据,需要格式化(保留N未有效数字)或者是保留N为小数等情况,我们往往采取double.tostring("参数");的方法.下 ...

  4. C#版 - PAT乙级(Basic Level)真题 之 1024.科学计数法转化为普通数字 - 题解

    版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. PAT Bas ...

  5. PHP防止数字太大转化为科学计数法的方法

    PHP当数字在20位或者20位以上时,会转化为科学计数法 例子: <?phpecho 11111111111111111111; ?> 解决方法可以使用php函数number_format ...

  6. [SoapUI] 将科学计数法转化为普通数字,并且只保留小数点后几位

    方案一: import java.text.NumberFormat class CompareHashMap { def regEx_Numeric = '-?[1-9]\\d*$|-?([1-9] ...

  7. 【取对数+科学计数法】【HDU1060】 N^N

    Leftmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...

  8. PHP 大数自动转换为科学计数法

    前段时间碰到一个很头疼的问题,就是大于12位的数字在PHP中,会自动转成科学计数法表 示. 比如 1234567891234 显示为 1.23456789123E+12 , 最后只能在计算出大数之后, ...

  9. 【转】js 中导出excel 较长数字串会变为科学计数法

    [转]js 中导出excel 较长数字串会变成科学计数法 在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串 ...

随机推荐

  1. 如何计算Data Guard环境中Redo所需的网络带宽传输 (Doc ID 736755.1)

    How To Calculate The Required Network Bandwidth Transfer Of Redo In Data Guard Environments (Doc ID ...

  2. 【机器学习基础】交叉熵(cross entropy)损失函数是凸函数吗?

    之所以会有这个问题,是因为在学习 logistic regression 时,<统计机器学习>一书说它的负对数似然函数是凸函数,而 logistic regression 的负对数似然函数 ...

  3. java基础 - 什么是hashmap的负载因子,hashmap的容量(即桶个数)为什么是2的幂次

    HashMap的负载因子是指,比如容量为16,负载因子为0.75,则当HashMap的元素个数达到16*0.75=12时,触发扩容.(16和0.75是初始默认的容量和负载因子). HashMap的容量 ...

  4. (day65、66)Vue基础、指令、实例成员、JS函数this补充、冒泡排序

    目录 一.Vue基础 (一)什么是Vue (二)为什么学习Vue (三)如何使用Vue 二.Vue指令 (一)文本指令 (二)事件指令v-on (三)属性指令v-bind (四)表单指令v-model ...

  5. TYUT程序设计入门第四讲练习题题解--数论入门

    程序设计入门第四讲练习题题解--数论入门 对于新知识点的学习,需要不断地刷题训练,才能有所收获,才能更好地消化知识点. 题组链接: 程序设计入门第四讲练习题--数论 by vjudge 题解: A. ...

  6. Qt 信号和槽异常: QObject::connect: No Such slot baseClassName::subClassfunction() in ......

    2019-08-14起笔 小熊的情况描述: 父类A继承自QWidget,所以父类A自动添加了Q_OBJECT.  子类B继承自父类A,子类B没有添加Q_OBJECT.在子类B中给动态创建的控件添加事件 ...

  7. python __getattr__和 __getattribute__

    __getattr__ 这个魔法函数会在类中查找不到属性时调用 class User: def __init__(self): self.info = 1 def __getattr__(self, ...

  8. 【已解决】前端到后端400错误(The server cannot or will not process the request due to...)

    看到400错误,一般是请求无效.出现该异常一般有三种情况: 第一种情况: 前端提交的内容在后端一般都用String类型来接收,用Date类型接收会报错. 第二种情况: 在提交表单的时候,填写的数据类型 ...

  9. 以太坊智能合约开发 Solidity学习

    1. pragma solidity >=0.4.22 <0.6.0;//版本号,头文件 contract BooleanTest { bool _a;//默认返回false int nu ...

  10. C# 管道通信 (client —— server)Framework2.0版本也可用

    //管道服务类public class PipServer { [DllImport("kernel32.dll", SetLastError = true)] public st ...