-
-32767转化为二进制_十进制小数如何转换为二进制
2020-12-28 09:54:15位运算在计算机编程中经常...比如下图中的例子,十进制的13转为二进制表示,则为1101。十进制转二进制二进制转十进制的原理:二进制数的每一位乘以2的n次方,n 从零开始,每次加一,最后累加。下面是将二进制的1101...位运算在计算机编程中经常用到,所以掌握十进制和二进制间的转换十分重要。
- 十进制:由 0~9 十个数字组成
- 二进制:由 0和1 两个数字组成
1、整数转换
十进制转二进制的原理:十进制的数除以2,直到商为0,最后反向取余数。
比如下图中的例子,十进制的13转为二进制表示,则为1101。
十进制转二进制
二进制转十进制的原理:二进制数的每一位乘以2的n次方,n 从零开始,每次加一,最后累加。
下面是将二进制的1101转为十进制的13。
二进制转十进制
2、小数转换
对于小数,二进制 转 十进制 比较简单,仍是二进制数的每一位乘以2的n次方,小数点前面的 n 从零开始,每次加一;小数点后面的 n 从-1开始,每次减一,最后累加。
小数-二进制转十进制
十进制 转 二进制 相对麻烦些,用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,如此进行,直到积中的小数部分为0,整数部分为1,此时1为二进制的最后一位。
下图是将十进制的0.625转换为二进制表示的0.101。
小数-十进制转二进制
不过,不是所有的十进制小数都恰好能用二进制精确表示。比如十进制的0.3转化为用二进制表示,如下图所示。若用小数点后六位来表示,则只能近似为0.296875。
小数-十进制转二进制
从上面的例子可以看出,二进制小数点后面的位数越多,则能表示的小数点后面的有效数字越多。
C语言中浮点型一般分为 float 单精度型(4个字节)和 double 双精度型(8个字节),单精度浮点型小数点后面有效数字为6位,双精度浮点型小数点后面有效数字为15位。
相关阅读
C语言的位级运算:布尔代数
计算机为什么用二进制和十六进制
-
将十进制小数转化为二进制小数
2014-05-12 10:14:44我的十进制小数换成二进制该如何表示? 比如:0.3 的二进制表示为:0.0100110011001.... (小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。 0.8125x2=1.625 取整1,小数部分是...小数表示原理
你了解小数的表示原理吗?
我的十进制小数换成二进制该如何表示?
比如:0.3 的二进制表示为:0.0100110011001....
(小数乘以2,取整,小数部分继续乘以2,取整,得到小数部分0为止,将整数顺序排列。
0.8125x2=1.625 取整1,小数部分是0.625
0.625x2=1.25 取整1,小数部分是0.25
0.25x2=0.5 取整0,小数部分是0.5
0.5x2=1.0 取整1,小数部分是0,结束所以0.8125的二进制是0.1101)
import java.math.BigDecimal; import java.util.Scanner; public class H4 { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); String input = scanner.nextLine(); BigDecimal num = BigDecimal.valueOf(Double.parseDouble(input)); String output=""; trans(num,output); } public static void trans(BigDecimal num,String output) { num = num.multiply(BigDecimal.valueOf(2)); String tmp = num.toString().substring(0, 1);//取小数点前一位 output +=tmp; num=num.subtract(BigDecimal.valueOf(Double.parseDouble(tmp))); if(num.compareTo(BigDecimal.ZERO)==0||output.length()==10) {//如果num=0或者小数点后有10位就停止递归 System.out.println("0."+output); return; } trans(num,output); } }
-
bash 将二进制转换为十进制_二进制如何转化为十进制
2020-12-21 10:27:14展开全部二进制32313133353236313431303231363533e78988e69d8331333366306435转十进制方法:“按权展开求和”【例】:规律:个位上的...注意:不是任何一个十进制小数都能转换成有限位的二进制数。(2)十进制转二进制...展开全部
二进制32313133353236313431303231363533e78988e69d8331333366306435转十进制
方法:“按权展开求和”
【例】:
规律:个位上的数字的次数是0,十位上的数字的次数是1,......,依次递增,而十
分位的数字的次数是-1,百分位上数字的次数是-2,......,依次递减。
注意:不是任何一个十进制小数都能转换成有限位的二进制数。
(2)十进制转二进制
· 十进制整数转二进制数:“除以2取余,逆序排列”(除二取余法)
【例】:
89÷2 ……1
44÷2 ……0
22÷2 ……0
11÷2 ……1
5÷2 ……1
2÷2 ……0
1
扩展资料:
二进制数转换成十六进制数:二进制数转换成十六进制数时,只要从小数点位置开始,向左或向右每四位二进制划分一组(不足四位数可补0),然后写出每一组二进制数所对应的十六进制数码即可。
十六进制数转换成二进制数:把每一个十六进制数转换成4位的二进制数,就得到一个二进制数。
十六进制数字与二进制数字的对应关系如下:
0000 -> 0 0100 -> 4 1000 -> 8 1100 -> C
0001 -> 1 0101 -> 5 1001 -> 9 1101 -> D
0010 -> 2 0110 -> 6 1010 -> A 1110 -> E
0011 -> 3 0111 -> 7 1011 -> B 1111 -> F
【例】:将十六进制数5DF.9 转换成二进制:
5 D F . 9
0101 1101 1111 .1001
即:(5DF.9)16 =(10111011111.1001)2{十六进制怎么会有小数点}
【例】:将二进制数1100001.111 转换成十六进制:
0110 0001 . 1110
6 1 . E
即:(1100001.111)2 =(61.E)16
-
java十进制小数转化为二进制小数代码 乘二取整法_(四)改掉这些坏习惯,还怕写不出健壮的代码?...
2020-12-08 02:36:59(二)改掉这些坏习惯,还怕写不出优雅的代码?(三)改掉这些坏习惯,还怕写不出优雅的代码?书接上篇,本次继续探讨一下,该如何写出健壮的代码?1编码时:看似顺眼,实则不然。举个栗子?:String amount = request....Code Review 是一场苦涩但有意思的修行。
(一)改掉这些坏习惯,还怕写不出健壮的代码?
(二)改掉这些坏习惯,还怕写不出优雅的代码?
(三)改掉这些坏习惯,还怕写不出优雅的代码?
书接上篇,本次继续探讨一下,该如何写出健壮的代码?
1
编码时:看似顺眼,实则不然。
举个栗子?:
String amount = request.getParameter("amount");// 校验金额小数点后最多两位小数BigDecimal a = new BigDecimal(amount);if (a.doubleValue() * 100 - Math.floor(a.doubleValue() * 100) != 0) { System.out.println("交易金额错误"); // do something ... ...}
摘一段跑在生产环境上的代码,代码咋一看没啥问题,主要功能是获取请求参数;然后完成数据校验。
看似很顺眼,但是你细品,就会发现其中之奥秘,下面一起在本地跑跑代码,来分析一下到底会存在什么问题?
问题一:坑死人的 NPE
输入:null(当 amount 输入为空时)
输出:
Exception in thread "main" java.lang.NullPointerException at java.math.BigDecimal.<init>(BigDecimal.java:806) at PayController.main(PayController.java:300)
分析:
根据上面异常信息,见 BigDecimal 的源码第 806 行,如下图所示,很显然 BigDecimal 构造不会判断传入的 val 是否为空,所以会出现空指针异常。
目前没有出现问题,那只能算庆幸,不过终究是个定时炸弹。切记调用 BigDecimal 的构造时,请勿传入 null 值。
心声:
身边老码农真真的排查了好长时间,问题场景与此类似,直接阻断了程序后续的流程。
问题二:同样是传入数字,结果咋就匪夷所思。
输入:
6666.66(当 amount 输入为 6666.66)
当 amount 输入为 6666.66 时,amount 的值校验通过。真的是看到的这个样子吗?换个数试试呗。
输入:
8888.88(当 amount 输入为 8888.88)
输出:
交易金额错误
分析:
容我拆解一下代码,当 amount 传入为 8888.88 时:
double d1 = a.doubleValue() * 100;double d2 = Math.floor(a.doubleValue() * 100);System.out.println(d1); // 输出:888887.9999999999System.out.println(d2); // 输出:888887.0System.out.println(d1 - d2); // 输出:0.9999999998835847
很显然, d1 - d2 的值 != 0,那么如下表达式的值则满足,会输出交易金额错误。
为什么呢?归根揭底是 double 运算时精度丢失而导致程序处理出错,虽然在 Java 中提倡用 BigDecimal 进行四则运算,但是上面的校验实现,貌似跟 BigDecimal 没有啥关系,到底该怎么解决呢?
无脑实现方式:
if (amount.contains(".") && amount.substring(amount.indexOf(".") + 1).length() > 2) { System.out.println("校验失败 2"); // do something ... ...}
如上面代码段所示,直接判断传入的 amount 字符串小数点后面的位数就可以啦。
当然,仁者见仁智者见智,实现方式有很多,不去多深究。
2
编码时:时间转换也作祟
举个栗子?:
public static long convertDaysToMilliseconds(int days) { return 1000 * 3600 * 24 * days;}
分析:
1000 * 3600 * 24 * days 结果默认为 int 类型,最大值为 2147483647,如果超过 int 范围,则会出现截断,程序不会出错,但是结果却匪夷所思。
例如:
当 days 输入为 30 时,程序输出:-1702967296。
改进方式一:
改进方式二:
再举个栗子?:
public static Date getDate(int seconds) { return new Date(seconds * 1000);}
分析:
当 seconds * 1000 值为 int 类型,当超过 int 最大值为2147483647 时,程序不会出错,但是结果却匪夷所思。
改进方式:
分享一下心声:
1. 禁止使用 double 直接参与金额运算,会出现意想不到的结果。
浮点数采用“尾数+阶码”的编码方式,类似于科学计数法的“有效数字+指数”的表示方式。 二进制无法精确表示大部分的十进制小数。
—— 请自行科普,留作业。
2. 禁止使用构造方法 BigDecimal(double)的方式把 double 值转化为 BigDecimal 对象。
BigDecimal(double)存在精度损失风险,在精确计算或值比较的场景中可能会导致业务逻辑异常。
如:BigDecimal g = new BigDecimal(0.1f); 实际的存储值为:0.10000000149
优先推荐入参为 String 的构造方法,或使用 BigDecimal 的 valueOf 方法,此方法内部其实执行了 Double 的 toString,而 Double 的 toString 按 double 的实际能表达的精度对尾数进行了截断。
—— 阿里开发手册
3. 那些看似顺眼的代码,或者线上跑着的代码,未必就没问题,只是没有走到异常分支上去,随着时间的推移,定时炸弹迟早会爆,定期审查代码,以及充分的测试是非常的必要。
3
寄语写最后
我等采石之人当心怀大教堂之愿景——《程序员修炼之道》。
好了,代码修炼的系列分享,本次就谈到这里,一起聊技术、谈业务、喷架构,少走弯路,不踩大坑。会持续输出原创精彩分享,敬请期待!
推荐阅读:
(一)改掉这些坏习惯,还怕写不出健壮的代码?
(二)改掉这些坏习惯,还怕写不出优雅的代码?
(三)改掉这些坏习惯,还怕写不出优雅的代码?
坚持是一种信仰,在看是一种态度! -
十进制小数转为二进制
2015-01-16 12:01:37整数部分当然和十进制整数转换方式一样,也就是说小数部分如何转化为二进制? 方法:乘2取整法,即将小数部分乘以2,然后取整数部分,剩下的小数部分继续乘以2,然后取整数部分,剩下的小数部分又乘以2,一直取到... -
js 单精度浮点数转10进制_JavaScript 十进制小数转为二进制精度问题及解决方案...
2020-12-24 05:55:39十进制小数转为二进制小数方法拿 173.8125 举例如何将之转化为二进制小数。①. 针对整数部分 173,采取除 2 取余,逆序排列;173 / 2 = 86 ... 186 / 2 = 43 ... 043 / 2 = 21 ... 1 ↑21 / 2 = 10 ..... -
二进制转化为十进制_四年级:美妙数学之“小数如何进行不同进制转化”(0629四)...
2020-11-23 21:36:19”在前面的学习中,你可能已经注意到了,我们都是在整数范围内研究二进制的,在十进制中,我们已经认识过小数了,那么小数是如何进行不同进制的转化呢?点击边框调出视频工具条天天我认为计数单位很重要,如果知道二... -
二进制转十进制 转化详解
2019-07-23 10:29:33二进制如何转十进制,十进制如何转二进制 十进制转二进制 转成二进制主要有以下几种:正整数转二进制,负整数转二进制,小数转二进制; 1、 正整数转成二进制。要点一定一定要记住哈:除二取余,然后倒序排列,高位... -
c++将十进制转换为二进制 小数_数制的概念与常用的数制之间的转换。大学生必看!...
2020-11-24 05:31:27例如:常用的十进制、二进制、八进制、十六进制等。基数:在该进位制中可能用到的数码个数。(如果这里看不懂,往后看就明白了)例如:十进制的基数是10;八进制的基数是8。位权(位的权数):进位计数制中,某... -
十进制转化为二进制的方法的理论证明
2012-10-11 15:46:44十进制0.4 转化为二进制为0.0110011001100110011001100110011001100110011001100110011... 这个如何操作过来的我知道。 我要问的是:为啥这样操作可以表示任一个十进制小数。 小于1的正小数,一亿个人一辈子也... -
为什么十进制浮点数常常无法用二进制精确表示?
2019-05-27 22:39:00十进制浮点数很好理解,就是我们日常所见的数字,比如3.3,2.56等数字,都是十进制的。那么,二进制小数该如何表示呢? 首先,我们先看下整数,对于十进制整数10,用二进制... 比如,对于3.3,如何转化为二进制表... -
计算机的进制及其相互转化规则。
2020-05-11 11:44:27进位计数法。 基数,二进制的基数是二,十进制的基数是十,十六进制的基数是16 r进制转化为10进制的方法 从右往左为该数的每个数位边上序号序号从零开始...那么十进制的小数部分如何转化为任意进制的呢? 我们用的 -
在IEEE754标准下浮点数如何用二进制数表示以及为什么用移码代替补码
2019-03-31 10:33:231、补充:十进制数0.4如何转化为二进制数0110 0110(0110循环) float精度有限精确到6~7位 2、、 符号位,位于存储浮点数的最高比特位,且只占1比特。0表示正数,1表示负数。通过改变该比特位的值可以改变该浮点数... -
Java:利用BigDecimal类巧妙处理Double类型精度丢失
2020-12-29 09:44:43十进制小数如何转化为二进制数?如何用BigDecimal解决double精度问题?new BigDecimal(double val)new BigDecimal(String val)BigDecimal.valueOf(double val)Double的加减乘除运算工具类阿里巴巴Java开发手册关于... -
java中float的二进制详解
2014-06-11 17:02:07问题提出:12.0f-11.9f=0.10000038,"减不尽"为什么? 现在我们就详细剖析一下浮点型运算为什么会造成精度丢失... (1) 十进制整数如何转化为二进制数 算法很简单。举个例子,11表示成二进制数: -
浮点数丢精度分析
2019-10-24 09:27:32一、十进制整数如何转化为二进制数,只要遇到除以后的结果为0了就结束了 举个例子,11表示成二进制数: ...二、十进制小数如何转化为二进制数,算法是乘以2直到没有了小数为止 举个例子,... -
BigDecimal使用详解
2020-09-14 15:29:24十进制小数如何转化为二进制数,算法是乘以2直,取整数部分直到没有了小数为止。举个例子,十进制小数0.9表示成二进制数: 0.9*2=1.8 取整数部分 1 0.8(1.8的小数部分)*2=1.6 取整数部分 1 0.6*2=1.2 取整数部分... -
mysql 查询double_Mysql Double查询进度丢失,在java程序里面解决。
2021-01-19 12:54:10从图中可以看出,保存在库里的值也开始丢失精度...十进制小数如何转化为二进制数算法是乘以2直到没有了小数为止。举个例子,0.9表示成二进制数0.9*2=1.8 取整数部分 10.8(1.8的小数部分)*2=1.6 取整数部分 10.6*2=1.... -
ASCII及十六进制转换工具《建》
2010-09-11 10:39:41IP转二进制:把IP地址或子网掩码转化为二进制形式. 二进制数操作:把上面转化到的IP二进制进行取反、与、或操作。 说明:普通二进制(即没有包括".")也可进行操作。 IP二进制转十进制:即把上面得到的二进制结果... -
关于小数0.0/0.0问题
2019-06-04 17:16:53十进制的小数可以转化为二进制小数(整数部分连续除以二,小时部分连续乘2),但计算机根本不懂小数点,那应该怎末处理呢? 表达浮点数的0,1序列被分为三部分,以32位单精度浮点数为例,其具体的转换规则... -
python浮点数怎么运算_为什么说浮点数缺乏精确性? python中浮点数运算问题
2021-02-10 17:40:48我想从两个角度回答:一:十进制小数转化成二进制小数的方法。(简单举例,看完就可以自己用笔进行运算。)二:如何解决python中的浮点数运算问题。关于一:拿1.375这个十进制数举例,python解释器会将这个十进制数字... -
定点小数的运算
2017-08-07 17:09:25FPGA中的数都是用二进制表示的,下面介绍如何...以Q12为例,Q12正数的最大值为0111.111111111111,要计算其需要表示的小数时,计算过程如下:将二进制数0111111111111111转化成十进制数32767,用十进制32767÷2^12=7.9 -
计算机进行浮点型运算为什么会造成精度丢失
2019-04-04 16:47:04(1) 十进制整数如何转化为二进制数 二进制整数 1111 第一位1表示十进制1 第二位1表示十进制2 第三位1表示十进制4 第四位1表示十进制8 ...... 十进制11表示成二进制数: 11/2=5 余 1 5/2=2 余 1 2/2=1 余 0 1/2=0 ..... -
对“在EXCEL中如何使用VBA进行格式转化”的改进算法
2008-07-05 22:58:00对“在EXCEL中如何使用VBA进行格式转化”的改进算法在在EXCEL中如何使用VBA进行格式转化中,我们简单的讨论了如何用VBA实现十六进制、十进制、八进制和二进制之间的转化。对于简单的小数运用,它工作良好,但是它有... -
计算机如何表示小数?带例题(定点法、浮点法)
2021-03-19 17:52:33二进制 101.011 转化为十进制 101.011101.011101.011 =(1∗20+0∗21+1∗22)+(0∗2−1+1∗2−2+1∗2−3)= (1*2^0 + 0*2^1 + 1*2^2)+(0*2^{-1} + 1*2^{-2} + 1*2^-3)=(1∗20+0∗21+1∗22)+(0∗2−1+1∗2−2+1∗2−3) =... -
读《程序是怎么跑起来的》第三章有感
2019-01-27 16:59:00此章开头作者就举出了一个例子,一个将0.1累加100次的程序,如果不是作者强调,...本章还讲解了二进制小数如何转化为十进制,同样是将各数位数值和和位权相乘在相加。 最后向我们补充了二进制和十六进制之间的关系... -
float类型数据精度问题:12.0f-11.9f=0.10000038,"减不尽"为什么?
2019-06-20 10:03:00现在我们就详细剖析一下浮点型运算为什么会造成精度丢失? 1、小数的二进制表示问题 ... (1) 十进制整数如何转化为二进制数 算法很简单。举个例子,11表示成二进制数: 11/2=5 余 1 5/2=2 余 1... -
IEEE 754——计算机中浮点数的表示方法
2016-02-14 11:24:03对于整数,情况比较简单,直接按照数学中的进制转换方法处理即可,即连续除以2取余(比如十进制的10转化为二进制形式,11除以2得5 余1,5除以2得2 余1,2除以2得1 余0,1除以2得0 余1,10111011 即是最终的二进制... -
浮点数在计算机中的保存
2017-01-14 14:26:34首先了解如何用二进制表示小数(也就是如何把十进制小数转化为二进制表示): 举一个简单例子,十进制小数 10.625 1)首先转换整数部分:10 = 1010b 2)小数部分0.625 = 0.101b (用“乘2取整法”:0.625*2=1.25,得... -
浮点型数据在计算机中存储
2017-03-26 09:40:59计算机用二进制来表示数字,浮点数也是如此:首先了解如何用二进制表示小数(也就是如何把十进制小数转化为二进制表示):举一个简单例子,十进制小数 10.6251)首先转换整数部分:10 = 1010b2)小数部分0.625 = 0....