科学计数法使用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. Linux系统学习 十四、VSFTP服务—配置文件解析、客户端使用

    3.配置文件解析 默认配置选项: 一般情况下不允许匿名用户登录 全局配置选项:(手工添加) listen_address=192.168.4.1             #设置监听地址 listen_ ...

  2. Map随笔:最常用的Map——HashMap

    目录 Map随笔:最常用的Map--HashMap 前言: 1,HashMap的结构 2,HashMap的一些属性(JDK8) 3,HashMap的构造函数(JDK8) 4,HashMap的一些方法( ...

  3. Java中文本文件的读取(按行读取)

    在之前的学习过程中,经常会遇到将文本文件中的数据读取到数组或其他数据结构中.每次遇到,总是在网上搜索代码解决,解决之后并没有总结复习,因此在下一次遇到同样的问题时,又重复之前的过程.这样周而复始,并没 ...

  4. 使用vue-cli创建工程的时候提示vue-cli Failed to download repo vuejs-templates/webpack-simple:self signed certificate in certificate chain的解决方法

    最近在使用 vue-cli 脚手架创建项目的时候,遇到 webpack-simple 模板下载不成功的情况,提示 vue-cli Failed to download repo vuejs-templ ...

  5. ASP.NET MVC教程三:ASP.NET MVC部署方式

    ASP.NET MVC编写的程序需要部署到IIS上面才能进行访问,部署方式分为两种. 一.直接用源代码部署 第一种方式可以直接使用源代码进行部署.部署步骤: 1.新建网站 在IIS里面选择网站,然后右 ...

  6. 周会材料:高并发程序设计<一>

    第一章 几个概念 同步:一次方法调用须等到其返回后才能有后续 异步:一次方法调用后在另一线程执行,调用者可不必等其返回就可进行后续 并发:任务以极短的时间交替进行 并行:任务同时进行 临界区:公共资源 ...

  7. linux指令大全(归类整理)

    一.文件目录指令 1 pwd指令 pwd 显示当前所在的目录 2 ls指令 ls [选项] [目录或文件] 查看文件信息 ls -a 查看所有文件和目录,包括隐藏的 ls -l 以列表的方式显示 ll ...

  8. iOS随记

    ios 10 访问设置问题 从ios8之api支持访问设置通过访问UIApplicationOpenSettingsURLString来跳转设置 NSURL*url=[NSURL URLWithStr ...

  9. DBUtils框架的使用(上)

    昨天做了这么多的铺垫,当然就是为了引出今天的DBUtils框架了,它的实现原理跟我们编写的简易框架是类似的. 话不多说,进入正题. commons-dbutils 是 Apache 组织提供的一个开源 ...

  10. c程序内存检测工具 - Valgrind

    常用C程序内存泄露检测工具 https://blog.csdn.net/u012662731/article/details/78652651