设为首页 加入收藏

TOP

[20190929]bash使用bc计算的相关问题.txt(一)
2019-10-09 19:58:29 】 浏览:36
Tags:20190929 bash 使用 计算 相关 问题 .txt

[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\
00000000000000000000000000000000000

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇centos 7 安装webmin 下一篇Ubuntu下安装并使用sublime text ..

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目