关于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 ...
随机推荐
- jsp学习与提高(五)——JSP 异常处理
JSP 异常处理 当编写JSP程序的时候,程序员可能会遗漏一些BUG,这些BUG可能会出现在程序的任何地方.JSP代码中通常有以下几类异常: 检查型异常:检查型异常就是一个典型的用户错误或者一个程序员 ...
- 在双系统(Win7和Ubuntu Kylin)中卸载Ubuntu
由于以前学习Linux相关的知识,所以在win7的基础上装了ubuntu系统,最近在使用中老是出现一些问题,想将其卸载,于是在网上找了些相关方法. 我每次开机时,都会出现GRUB界面(我需要选择要进入 ...
- Codeforces Round #561 (Div. 2) C. A Tale of Two Lands
链接:https://codeforces.com/contest/1166/problem/C 题意: The legend of the foundation of Vectorland talk ...
- Uva11572
读入可以不需要存入数组 #include<bits/stdc++.h> #define inf 0x3f3f3f3f //const int maxn=; using namespace ...
- Python 工具包 werkzeug 初探
首先,先向大家介绍一下什么是 werkzeug,Werkzeug是一个WSGI工具包,他可以作为一个Web框架的底层库.这里稍微说一下, werkzeug 不是一个web服务器,也不是一个web框架, ...
- Hive_Hive的数据模型_桶表
对数据进行HASH运算,放在不同文件中,降低热块,提高查询速度. 例如:根据sname进行hash运算存入5个桶中. create table bucket_table(sid int, sname ...
- Net Core免费开源分布式异常日志收集框架Exceptionless
asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程 https://www.cnblogs.com/yilezhu/p/9193723.htm ...
- kali linux安装搜狗输入法
1. 更新软件源 vi /etc/apt/sources.list 2. 安装fcitx apt-get install fcitx 3. 下载deb包到指定目录, dpkg -i sogou**** ...
- CentOS 6.2安装配置LAMP服务器(Apache+PHP5+MySQL)
准备篇: 1.配置防火墙,开启80端口.3306端口 vi /etc/sysconfig/iptables -A INPUT -m state --state NEW -m tcp - ...
- 从一个LocalDateTime引发的疑问
一 公司有同事部署出错,然后查日志,找时间,从k8s得到的时间是 2017-06-16T09:38:48.580 +0000,然后他就纳闷了,因为他根本不会在9点部署好吧,而且9点大多数程序员都没开 ...