[20190929]bash使用bc计算的相关问题.txt

--//快放假没什么事情,使用bash写一些小程序,转化number到oracle number编码,使用bc计算功能,发现一些小问题
--//做一些记录:

1.bc显示小数点前的0:

$ echo "scale=3; 1/3" | bc
.333

--//很明显如果结果是0.xxxxx,bc的计算结果前面的0不显示。
--//可以在网上找到一些方法:
res1=$(printf "%.2f" `echo "scale=2;1/3"|bc`)

--//另外bc是高精度的计算器,可能小数点位数很多,上面的printf不行。
--//可以采用连接的方式,仅仅先判断第一个字符是否是"."就ok了(当然时正数的情况下)。

2.四舍五入问题:
# echo "scale=3; 2/3" | bc
.666

--//运算不做四舍五入。

3.scale设置无效的问题:

# echo  "scale=0 ; (0.01+193)" | bc
193.01

--//我想取整,结果输出193.01.导致设置scale=0无效,似乎+,-,*运算都不起作用,仅仅/可以控制这种行为。
# echo  "scale=0 ; (0.01+193)*1" | bc
193.01

# echo  "scale=0 ; (0.01+193)/1" | bc
193

4.输出折行问题。
# echo 2^250 | bc
18092513943330655534932966407607485602073435104006338131165247501236\
42650624

--//如果计算超过68个字符,会出现折行情况,当然这是正常的,加入tr过滤ok。
# echo 2^250 | bc | tr -d '\n\\\r'

--//另外我在window下使用cygwin ,输出里面有"\r"字符.通过例子说明:
$ cat aa.sh
#! /bin/bash
set -x
a=$(echo 5+4 | bc )
echo "$a"
echo $a
set +x

$ ./aa.sh
++ echo 5+4
++ bc
+ a=$'9\r'
+ echo $'9\r'
9
+ echo $'9\r'
9
+ set +x

--//你可以发现在windows下bc的输出多了1个\r字符.必须过滤掉.估计linux下没有这个问题.
--//另外注意一个小问题,就是要保存文件格式为unix的文件格式.

5.计算精度问题:
# echo "l(.99999999999999999999)/l(100)" | bc -l
0

--//bc -l 缺省的scale=12,必须改变scale设置。
# echo "scale=66;l(.99999999999999999999)/l(100)" | bc -l
-.000000000000000000002171472409516259138266501956630606707163335634

--//有一些情况即使设置很高精度反而出现问题,例子:
> bc -l
scale=180
l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(100)
-65.0000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
000000000000000000000248123508996454719162468354

--//这个正常输出-65.

l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
-130.000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
0000000000000000000000496247017992909438324936737

scale=20
l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
-130.00000000000000000044
scale=10
l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
-130.0000000052
scale=4
l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
-130.0047

--//当你限制scale过小时,反而误差更大。

scale=400
l(0.0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001)/l(10)
-130.000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000000000000000000000000000000000\
00000000000000000000000000000000000000171086395582297672322451960

6.bc不支持科学计数法(科学计数法):
# echo "1e2" | bc
(standard_in) 1: parse error

7.另外我发现bash编程能不用bc尽量不用,能不加载math库,尽量不要加载。
--//最后我发现我写出来的转化程序number到oracle number编码运行不是很快,我是在windows下使用cygwin调试的。基本上转化1个大
--//约接近2秒,我只能考虑别的方式尽可能减少bc使用。

最新文章

  1. Netty源码分析之服务端启动过程
  2. selenium 封装代码
  3. Linux-设置固定IP
  4. Android深度探索--HAL与驱动开发----第八章读书笔记
  5. 关于Winform 2.0以后多线程不能更新UI的办法
  6. hibernate继承(转)
  7. asp.net webapi 序列化为xml 时实体属性增加<![CDATA[]]>防止特殊字符
  8. FZU 2216 The Longest Straight 模拟
  9. CSS2伪类选择器要点
  10. iOS的沙箱目录和文件操作
  11. Redis学习资料汇总(荐)
  12. java- 枚举的常见用法
  13. hdu 2612 Find a way(BFS)
  14. jquery选择器控制Html元素
  15. Day4 - Linux分区规划与xshell使用排错
  16. mint-ui vue双向绑定
  17. 分布式架构原理解析,Java开发必修课
  18. [物理学与PDEs]第2章习题7 一维不可压理想流体的求解
  19. 泊爷带你学go -- 经典的继承与接口 简直吊炸天 !
  20. DOM操作 JS事件 节点增删改查

热门文章

  1. 地图SDK全新版本v4.3.0上线 - 新增多项功能及优化
  2. MySQL数据库:在命令提示符中使用mysql
  3. git 现在本地创建仓库 再 推送到 远程 github 仓库中
  4. [Linux] 安装grafana并且添加influxdb监控
  5. 如何在文本编辑器中实现搜索功能? 字符串比较算法 BF算法 RK算法
  6. css3中calc、vw、vh、vmin、vmax 属性的应用及兼容性详解
  7. Codeforces Round #598 (Div. 3) F. Equalizing Two Strings 构造
  8. Tomcat 设置JVM内存大小
  9. 【STM32H7教程】第20章 STM32H7的GPIO应用之无源蜂鸣器
  10. 1+x证书web前端开发jquery专项练习测试题