关于bc中小数点length,scale,(())以及进制转换
?
這是我在codewar上遇到的一個題,我用我自己的方法做出了解答,如下:
1 #!/bin/bash2 3 distance=`echo "$1*10000"|bc|cut -d"." -f1`4 a=05 n=16 7 if [ $distance -le 0 ];then8 echo None9 else 10 while [ $n -lt $distance ] ; do 11 let a++ 12 n=$((2**a)) 13 done 14 echo $a 15 fi 16 17 重慶-劉勇 2018/11/15 23:29:25在這里因?yàn)椴恢佬?shù)點(diǎn)的處理辦法,所以用了看起來很愚笨的cut來切割,直到通過后可以看到其他人的答案。有一種寫法,里面解決了很多小數(shù)點(diǎn)的問題,所以我記錄了下來,如下:
1 distance=$12 paper="0.0001"3 count=04 if (( $(echo "$distance<0" | bc -l) ))5 then 6 echo "None"7 else8 while (( $(echo "$paper<$distance" | bc -l) )) 9 do 10 paper=$(echo "scale=4;$paper*2" | bc ) 11 count=$((count+1)) 12 done 13 echo $count 14 fi第一個問題:
scale的用法:
1、顯示小數(shù)點(diǎn)后的位數(shù):
[root@centos7 ~]#echo "scale(1.234567)"|bc 6 [root@centos7 ~]#echo "scale(1.234000)"|bc 6? 他是會識別后面的0的哪怕無意義。
length是計(jì)算數(shù)值長度的另一個參數(shù),他會計(jì)算小數(shù)點(diǎn)前后所有的位數(shù),但是有個地方需要注意,當(dāng)這個小數(shù)點(diǎn)前只有一個0的時(shí)候,它是不計(jì)算這個0的
[root@centos7 ~]#echo "length(1.234567)"|bc 7 [root@centos7 ~]#echo "length(0.123456)"|bc 6?
2、截取小數(shù)點(diǎn)的位數(shù):
[root@centos7 ~]#echo "scale=3;1.23456*10"|bc 12.34560 [root@centos7 ~]#echo "scale=3;1.23456*10/1"|bc 12.345 [root@centos7 ~]#echo "scale=3;(1.23456+10)/1"|bc 11.234從此代碼可以看到,scale的生效和/1有絕對的關(guān)系,沒有這個格式會導(dǎo)致scale無效,無論是加減法,或者乘法,經(jīng)過測試以后發(fā)現(xiàn)最后的一步計(jì)算都必須以除法結(jié)尾,最簡單的就是/1了,當(dāng)然本來最后一步就是除法就可以忽略了。
?
利用bc進(jìn)行大小比較
echo "1>2"|bc
這里一定一定要注意的是,這個比較結(jié)果就是0或1,而不是代表true或false,因而不能用于if后的條件判斷!切記切記
但是在添加(())以后可以進(jìn)行比較判斷。注意看他們的結(jié)果,在添加了(())后,對表達(dá)式進(jìn)行了真假判斷
[root@centos7 ~]#(( $(echo "1>2"|bc) ))
[root@centos7 ~]#echo $?
1
[root@centos7 ~]#echo "1>2"|bc
0
[root@centos7 ~]#echo "1<2"|bc
1
[root@centos7 ~]#(( $(echo "1<2"|bc) ))
[root@centos7 ~]#echo $?
0
?
bc還可以方便快捷的進(jìn)行進(jìn)制轉(zhuǎn)換:
標(biāo)準(zhǔn)格式: echo "obase=2;ibase=16;FFFF" | bc ,obase表示輸出的進(jìn)制,ibase表示輸入的進(jìn)制,默認(rèn)輸入10位,所以也有簡寫為:echo "obase=2;123"|bc ,表示為輸入10進(jìn)制123,輸出2進(jìn)制
但是有一個地方需要特別注意,格式中obase必須在前,ibase在后,否則會有計(jì)算錯誤,如下
?
[root@centos7 ~]#echo "ibase=8;obase=16;17"|bc 11 [root@centos7 ~]#echo "ibase=10;obase=16;17"|bc 11 [root@centos7 ~]#echo "obase=16;ibase=8;17"|bc F [root@centos7 ~]#echo "obase=16;ibase=8;10"|bc 8 [root@centos7 ~]#echo "obase=16;ibase=8;117"|bc 4F [root@centos7 ~]#echo "ibase=8;obase=16;117"|bc 59?
?
轉(zhuǎn)載于:https://www.cnblogs.com/tony3154/p/10126397.html
總結(jié)
以上是生活随笔為你收集整理的关于bc中小数点length,scale,(())以及进制转换的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机显示器本身物理分辨率,电脑显示器常
- 下一篇: 度矩阵 邻接矩阵