关于bc中小数点length,scale,(())以及进制转换

这是我在codewar上遇到的一个题,我用我自己的方法做出了解答,如下:
1 #!/bin/bash
2
3 distance=`echo "$1*10000"|bc|cut -d"." -f1`
4 a=0
5 n=1
6
7 if [ $distance -le 0 ];then
8 echo None
9 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
在这里因为不知道小数点的处理办法,所以用了看起来很愚笨的cut来切割,直到通过后可以看到其他人的答案。有一种写法,里面解决了很多小数点的问题,所以我记录了下来,如下:
1 distance=$1
2 paper="0.0001"
3 count=0
4 if (( $(echo "$distance<0" | bc -l) ))
5 then
6 echo "None"
7 else
8 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、显示小数点后的位数:
[root@centos7 ~]#echo "scale(1.234567)"|bc
6
[root@centos7 ~]#echo "scale(1.234000)"|bc
6
他是会识别后面的0的哪怕无意义。
length是计算数值长度的另一个参数,他会计算小数点前后所有的位数,但是有个地方需要注意,当这个小数点前只有一个0的时候,它是不计算这个0的
[root@centos7 ~]#echo "length(1.234567)"|bc
7
[root@centos7 ~]#echo "length(0.123456)"|bc
6
2、截取小数点的位数:
[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有绝对的关系,没有这个格式会导致scale无效,无论是加减法,或者乘法,经过测试以后发现最后的一步计算都必须以除法结尾,最简单的就是/1了,当然本来最后一步就是除法就可以忽略了。
利用bc进行大小比较
echo "1>2"|bc
这里一定一定要注意的是,这个比较结果就是0或1,而不是代表true或false,因而不能用于if后的条件判断!切记切记
但是在添加(())以后可以进行比较判断。注意看他们的结果,在添加了(())后,对表达式进行了真假判断
[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还可以方便快捷的进行进制转换:
标准格式: echo "obase=2;ibase=16;FFFF" | bc ,obase表示输出的进制,ibase表示输入的进制,默认输入10位,所以也有简写为:echo "obase=2;123"|bc ,表示为输入10进制123,输出2进制
但是有一个地方需要特别注意,格式中obase必须在前,ibase在后,否则会有计算错误,如下
[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
关于bc中小数点length,scale,(())以及进制转换的更多相关文章
- Linux命令之bc - 浮点计算器、进制转换
用途说明 Bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下.手册页上说bc是An arbitrary precision calcu ...
- [No000071]C# 进制转换(二进制、十六进制、十进制互转)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- JS中的进制转换以及作用
js的进制转换, 分为2进制,8进制,10进制,16进制之间的相互转换, 我们直接利用 对象.toString()即可实现: //10进制转为16进制 ().toString() // =>&q ...
- 进制转换( C++字符数组 )
注: 较为简便的方法是用 整型(int)或浮点型(long.double 注意:该类型不一定能够准确存储数据) 来存放待转换的数值,可直接取余得到每一位数值 较为稳定的方法是用 字符数组储存待转换的数 ...
- C# 进制转换 (没有数值的长度限制)
曾经在大学时做过一个c的进制转换算法,那时由于技术的局限性,数值的大小受到限制(系统数据类型长度限制),多年以后,自己那台学习机陈旧后感觉要报废了,整理了一下里面的东西,偶尔在一个角落里发现了这个转换 ...
- JS-011-颜色进制转换(RGB转16进制;16进制转RGB)
在网页开发的时候,经常需要进行颜色设置,因而经常需要遇到进行颜色进制转换的问题,例如:RGB转16进制:16进制转RGB),前几天在测试的时候,发现网站的颜色进制转换某类16进制颜色(例如:#0000 ...
- php进制转换函数
1 十进制(decimal system)转换函数 ① 十进制转二进制 string decbin(int number). 参数为一个十进制整型数字,不是整型数字会自动转为整型数字,如'3'转为3 ...
- Swift3.0 进制转换
Swift3.0 进制转换 模块可以直接使用,写的不是很好,欢迎来喷 // Data -> HexStrings func dataToHexStringArrayWithData(data: ...
- JAVA基础学习之String、StringBuffer、StringBuilder、基本数据类型的使用、整形进制转换、集合Collection、Vector、ArrayList、LinkedList、HashSet、TreeSet等(3)
主函数类MainDemo.java package com.itcast.test20140109; import java.util.ArrayList; import java.util.Coll ...
随机推荐
- js框架:vue
vue是一套用于构建用户界面的渐进式框架,vue被设计为可以自底向上逐层应用,核心库只关注图层 待续.......
- .Net WebApi接口Swagger集成简单使用
Swagger介绍 Swagger 是一款RESTFUL接口的.基于YAML.JSON语言的文档在线自动生成.代码自动生成的工具.而我最近做的项目用的是WebAPI,前后端完全分离,这时后端使用Swa ...
- 安卓下点击a标签不跳转;点击a标签在手机真机上会调出手机键盘的解决办法
安卓下点击a标签不跳转的解决办法,是不用href做跳转的链接,改为用JS控制跳转 <a href="javascript:;" ontouchstart="wind ...
- Nginx托管.Net Core应用程序
Nginx托管.Net Core应用程序 一.安装.Net Core 参考官方文档:https://www.microsoft.com/net/core#linuxcentos 1.添加dotnet产 ...
- NET Core项目
在IIS上部署你的ASP.NET Core项目 概述 与ASP.NET时代不同,ASP.NET Core不再是由IIS工作进程(w3wp.exe)托管,而是使用自托管Web服务器(Kestrel) ...
- java中存储金额
很早之前, 记得一次面试, 面试官问存储金钱用什么数据类型? 当时只知道8种数据类型(boolean, byte, short, int, long, float, double, char)的我, ...
- python Fuction 方法的调用
def display():#无参数 print("No") return # display() def callfun():#调用 print("2") d ...
- 【转】LINQ to SQL语句(1)之Where
Where操作 适用场景:实现过滤,查询等功能. 说明:与SQL命令中的Where作用相似,都是起到范围限定也就是过滤作用的,而判断条件就是它后面所接的子句. Where操作包括3种形式,分别为简单形 ...
- 读取jar包内的文件内容
package com.chanpion.boot; import org.springframework.util.ResourceUtils; import java.io.File; impor ...
- idea远程debug:tomcat
在tomcat的bin/startup.sh中添加: 27780debug的端口 declare -x CATALINA_OPTS="-server -Xdebug -Xnoagent -D ...