Linux下科学计数法(e)转化为数字的方法 [shell中几种数字计算说明]
科学计数法使用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中几种数字计算说明]的更多相关文章
- iOS 科学计数法保留N位有效数字
iOS开发 项目中用到了将一个很大的数值转换成科学计数法的需求,转换成科学计数法的方式在iOS中其实是很好做的,使用NSNumber 的 kCFNumberFormatterScientificSty ...
- Java 科学计数法
目录 Java 科学计数法 1 科学计数法的概念 1.1 有效数字 1.2 E记号 2 Java中的科学计数法 2.1 NumberFormat 2.2 DecimalFormat 2.3 BigDe ...
- C#double转化成字符串 保留小数位数, 不以科学计数法的形式出现
在C#中大家都会遇到这种情况 double类型的数据,需要格式化(保留N未有效数字)或者是保留N为小数等情况,我们往往采取double.tostring("参数");的方法.下 ...
- C#版 - PAT乙级(Basic Level)真题 之 1024.科学计数法转化为普通数字 - 题解
版权声明: 本文为博主Bravo Yeung(知乎UserName同名)的原创文章,欲转载请先私信获博主允许,转载时请附上网址 http://blog.csdn.net/lzuacm. PAT Bas ...
- PHP防止数字太大转化为科学计数法的方法
PHP当数字在20位或者20位以上时,会转化为科学计数法 例子: <?phpecho 11111111111111111111; ?> 解决方法可以使用php函数number_format ...
- [SoapUI] 将科学计数法转化为普通数字,并且只保留小数点后几位
方案一: import java.text.NumberFormat class CompareHashMap { def regEx_Numeric = '-?[1-9]\\d*$|-?([1-9] ...
- 【取对数+科学计数法】【HDU1060】 N^N
Leftmost Digit Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) Tota ...
- PHP 大数自动转换为科学计数法
前段时间碰到一个很头疼的问题,就是大于12位的数字在PHP中,会自动转成科学计数法表 示. 比如 1234567891234 显示为 1.23456789123E+12 , 最后只能在计算出大数之后, ...
- 【转】js 中导出excel 较长数字串会变为科学计数法
[转]js 中导出excel 较长数字串会变成科学计数法 在做项目中,碰到如题的问题.比如要将居民的信息导出到excel中,居民的身份证号码因为长度过长(大于10位),excel会自动的将过长的数字串 ...
随机推荐
- Matlab线性规划
线性规划 线性规划的标准形式 \[\underset{x}{min}{\ c^Tx}\ s.t.\ Ax \leqslant b\] 例如,线性规划为: \[ \underset{x}{min ...
- 冒泡排序(C语言)
# include<stdio.h> int main(void) { int arr[10]={5,4,7,9,2,3,1,6,10,8}; //定义一个位排序的数组 int i; // ...
- 在IOS设备上POST提交form表单,后台接收不到值怎么办?
原文:https://blog.csdn.net/xhaimail/article/details/90440029 最近在工作上遇到一个奇葩问题,在Android和Windows平台上做请求时参数都 ...
- java之对象创建时各成员变量的初始值
除了byte short int long float double char bollean这基础类型外,其余的都是引用类型 成员变量类型 初始值 byte 0 short 0 int 0 long ...
- 你可能会忽略的 Git 提交规范
一.为什么需要规范? 无规矩不成方圆,编程也一样. 如果你有一个项目,从始至终都是自己写,那么你想怎么写都可以,没有人可以干预你.可是如果在团队协作中,大家都张扬个性,那么代码将会是一团糟,好好的项目 ...
- javascript基础修炼(12)——手把手教你造一个简易的require.js
目录 一. 概述 二. require.js 2.1 基本用法 2.2 细说API设计 三. 造轮子 3.1 模块加载执行的步骤 3.2 代码框架 3.3 关键函数的代码实现 示例代码托管在我的代码仓 ...
- 面试:Stream#foreach方法摸底三问,你都了解吗
JAVA8 新增了 Stream API,而在 Stream API 中又为程序员提供了一个遍历集合的 foreach 方法:java.util.stream.Stream#forEach. 那你对这 ...
- audio标签以及audio对象
一.audio标签 简单语法 <audio src="音频链接"></audio> 属性 属性 值 描述 autoplay 如果出现该属性,则音频在就绪后马 ...
- C# 利用itextsharp、Spire配合使用为pdf文档每页添加水印
下载类库: 直接下载 引入类库 功能实现 using iTextSharp.text.pdf; using Spire.Pdf; using Spire.Pdf.Graphics; using Sys ...
- 利用Azure虚拟机安装Dynamics 365 Customer Engagement之二:创建域控虚拟机
我是微软Dynamics 365 & Power Platform方面的工程师罗勇,也是2015年7月到2018年6月连续三年Dynamics CRM/Business Solutions方面 ...