博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
linux shell 数字计算详解
阅读量:2053 次
发布时间:2019-04-28

本文共 2214 字,大约阅读时间需要 7 分钟。

项目github地址:

欢迎大家star,留言,一起学习进步

代码中免不了要进行各种数据计算。抛开科学计算不提,普通的计算占地,百分比,同比,环比等需求就很常见。linux shell中进行数字计算,主要有如下几种方式:

1.bc

bc是比较常用的linux计算工具了,而且支持浮点运算:

[webopa@namenode-backup expensive_user]$ a=`echo 1+1 | bc`[webopa@namenode-backup expensive_user]$ echo $a2

但是浮点数运算的精度问题,暂时还没明白什么情况:

[webopa@namenode-backup expensive_user]$ b=`echo "1.2*1.2" | bc`[webopa@namenode-backup expensive_user]$ echo $b1.4[webopa@namenode-backup expensive_user]$ c=`echo "5.0/3.0" | bc`[webopa@namenode-backup expensive_user]$ echo $c1[webopa@namenode-backup expensive_user]$ d=`echo "scale=2;5.0/3.0" | bc`[webopa@namenode-backup expensive_user]$ echo $d1.66[webopa@namenode-backup expensive_user]$ e=`echo "scale=2;5.0/6.0" | bc`[webopa@namenode-backup expensive_user]$ echo $e.83

尤其最后一个,这到底什么鬼,小数点前的那个0跑哪里去了。。。

2.expr

不支持浮点数计算。这又是个大坑.而且要注意数字与运算符中的空格

[webopa@namenode-backup expensive_user]$ a=`expr 1+1`[webopa@namenode-backup expensive_user]$ echo $a1+1[webopa@namenode-backup expensive_user]$ a=`expr 1 + 1`[webopa@namenode-backup expensive_user]$ echo $a2[webopa@namenode-backup expensive_user]$ b=`expr 10 / 2`[webopa@namenode-backup expensive_user]$ echo $b5

3.$(())

同expr,不支持浮点数运算

[webopa@namenode-backup expensive_user]$ a=$((1+1))[webopa@namenode-backup expensive_user]$ echo $a2[webopa@namenode-backup expensive_user]$ b=$((1 + 3 ))[webopa@namenode-backup expensive_user]$ echo $b4

4.let

不支持浮点数运算,而且不支持直接输出,只能赋值

[webopa@namenode-backup expensive_user]$ let a=1+1[webopa@namenode-backup expensive_user]$ echo $a2[webopa@namenode-backup expensive_user]$ let b=50/5[webopa@namenode-backup expensive_user]$ echo $b10[webopa@namenode-backup expensive_user]$ let c=1.2*2-bash: let: c=1.2*2: syntax error: invalid arithmetic operator (error token is ".2*2")

5.awk

普通的运算:

[webopa@namenode-backup expensive_user]$ a=`echo | awk '{print 1.0/2.0}'`[webopa@namenode-backup expensive_user]$ echo $a0.5

控制精度:

[webopa@namenode-backup expensive_user]$ b=`echo | awk '{printf("%.2f",1.0/2.0)}'`[webopa@namenode-backup expensive_user]$ echo $b0.50

传递参数:

[webopa@namenode-backup expensive_user]$ c=`echo | awk -v a=1 -v b=3 '{printf("%.4f",a/b)}'`[webopa@namenode-backup expensive_user]$ echo $c0.3333

综合来看,还是awk最靠谱,其他的方式都有这样那样的问题。所以我平时一般都用awk来搞数学计算。

转载地址:http://hublf.baihongyu.com/

你可能感兴趣的文章
什么是卷积 卷积有什么用
查看>>
有趣的机器学习概念纵览:从多元拟合,神经网络到深度学习,给每个感兴趣的人
查看>>
K-近邻算法:KNN
查看>>
solver及其配置
查看>>
图说C++对象模型:对象内存布局详解
查看>>
【Java基础】Java类的加载和对象创建流程的详细分析
查看>>
JAVA多线程之volatile 与 synchronized 的比较
查看>>
Java多线程知识点总结
查看>>
Java集合框架知识梳理
查看>>
java中IO流知识梳理
查看>>
word2010如何保持在公式后面键入空格后或添加文字不变小?
查看>>
笔试题(一)—— java基础
查看>>
笔试题(二)—— sql语句
查看>>
Redis学习笔记(二)— 在linux下搭建redis服务器
查看>>
Redis学习笔记(三)—— 使用redis客户端连接windows和linux下的redis并解决无法连接redis的问题
查看>>
Eclipse配置错误——An internal error occurred during: "Building workspace".GC overhead limit exceeded
查看>>
Intellij IDEA使用(一)—— 安装Intellij IDEA(ideaIU-2017.2.3)并完成Intellij IDEA的简单配置
查看>>
Intellij IDEA使用(二)—— 在Intellij IDEA中配置JDK(SDK)
查看>>
Intellij IDEA使用(三)——在Intellij IDEA中配置Tomcat服务器
查看>>
Intellij IDEA使用(四)—— 使用Intellij IDEA创建静态的web(HTML)项目
查看>>