[20190929]bash使用bc計算的相關問題.txt--//快放假沒什麼事情,使用bash寫一些小程式,轉化number到oracle number編碼,使用bc計算功能,發現一些小問題--//做一些記錄:1.bc顯示小數點前的0:$ echo "scale=3; 1/3" | bc.333- ...
[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使用。