这是我在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,(())以及进制转换的更多相关文章

  1. Linux命令之bc - 浮点计算器、进制转换

    用途说明 Bash内置了对整数四则运算的支持,但是并不支持浮点运算,而bc命令可以很方便的进行浮点运算,当然整数运算也不再话下.手册页上说bc是An arbitrary precision calcu ...

  2. [No000071]C# 进制转换(二进制、十六进制、十进制互转)

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...

  3. JS中的进制转换以及作用

    js的进制转换, 分为2进制,8进制,10进制,16进制之间的相互转换, 我们直接利用 对象.toString()即可实现: //10进制转为16进制 ().toString() // =>&q ...

  4. 进制转换( C++字符数组 )

    注: 较为简便的方法是用 整型(int)或浮点型(long.double 注意:该类型不一定能够准确存储数据) 来存放待转换的数值,可直接取余得到每一位数值 较为稳定的方法是用 字符数组储存待转换的数 ...

  5. C# 进制转换 (没有数值的长度限制)

    曾经在大学时做过一个c的进制转换算法,那时由于技术的局限性,数值的大小受到限制(系统数据类型长度限制),多年以后,自己那台学习机陈旧后感觉要报废了,整理了一下里面的东西,偶尔在一个角落里发现了这个转换 ...

  6. JS-011-颜色进制转换(RGB转16进制;16进制转RGB)

    在网页开发的时候,经常需要进行颜色设置,因而经常需要遇到进行颜色进制转换的问题,例如:RGB转16进制:16进制转RGB),前几天在测试的时候,发现网站的颜色进制转换某类16进制颜色(例如:#0000 ...

  7. php进制转换函数

    1 十进制(decimal system)转换函数 ① 十进制转二进制 string  decbin(int number). 参数为一个十进制整型数字,不是整型数字会自动转为整型数字,如'3'转为3 ...

  8. Swift3.0 进制转换

    Swift3.0 进制转换 模块可以直接使用,写的不是很好,欢迎来喷 // Data -> HexStrings func dataToHexStringArrayWithData(data: ...

  9. 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 ...

随机推荐

  1. 概念端类型“xxx”中的成员“ID”的类型“Edm.Decimal”与对象端类型“xxx”中的成员“ID”的类型“System.Int64”不匹配

    概念端类型“xxx”中的成员“ID”的类型“Edm.Decimal”与对象端类型“xxx”中的成员“ID”的类型“System.Int64”不匹配 使用EF实体模型映射之后将edmx中xml映射关系中 ...

  2. 微信小程序采坑之上拉触底加载更多和下拉刷新

    小程序中加载更多数据一般都是触底刷新 有自带的函数: onReachBottom: function (){} 但是在使用时触发完全没有反应,后来尝试给外层加了一个高度,解决问题 仔细想想也是,没有设 ...

  3. python之is 和 == 的区别//编码和解码

    一.is  和  ==  的区别: 1  .id()   内存地址 2.  ==   比较    #比较两边的值 3.   is    比较   #比较的是内存地址 数字,字符串,有小数据池 #数字小 ...

  4. (转)linux下od命令的使用

    linux下od命令的使用 原文:http://blog.csdn.net/shylock_backer/article/details/46473283 名称:od作用:格式化输出文件中的数据提要: ...

  5. RabbitMQ使用教程(一)RabbitMQ环境安装配置及Hello World示例

    你是否听说过或者使用过队列? 你是否听说过或者使用过消息队列? 你是否听说过或者使用过RabbitMQ? 提到这几个词,用过的人,也许觉得很简单,没用过的人,也许觉得很复杂,至少在我没使用消息队列之前 ...

  6. Spring的配置及jar包下载

    一.相关说明 IOC: Inversion of Control,控制反转,是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependency In ...

  7. .net core 的跨域

    .net core 的跨域问题花了 我很长时间 接下来我简单的描述下解决过程 首先我在前端用jquery的ajax去调用自己的本地接口大致如下 $.ajax({ type:"POST&quo ...

  8. Webpack 入门学习

    1.什么是Webpack? Webpack可以看做是模块打包机:它做的事情是,分析你的项目结构,找到JavaScript模块以及其它的一些浏览器不能直接运行的拓展语言(Scss,TypeScript等 ...

  9. 两个页面实现mui轮播图与选项卡结合

    index.html页面 <!DOCTYPE html><html><head> <meta charset="utf-8"> &l ...

  10. Hive基础(1)

    Hive基础(1) Hive的HQL(2) 1. Hive并不是分布式的,它独立于机器之外,类似于Hadoop的客户端. 2. 元数据和数据的区别,前者如表名.列名.字段名等. 3. Hive的三种安 ...