java第二周的学习知识4(对原码,补码,反码和java中浮点数计算不准确的总结)
原码:
一个正数,转换为二进制位就是这个正数的原码。负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码。
但是原码有几个缺点,零分两种 +0 和 -0 。很奇怪是吧!还有,在进行不同符号的加法运算或者同符号的减法运算的时候,不能直接判断出结果的正负。你需要将两个值的绝对值进行比较,然后进行加减操作 ,最后符号位由绝对值大的决定。于是反码就产生了。
反码:
正数的反码就是原码,负数的反码等于原码除符号位以外所有的位取反。
解决了加减运算的问题,但还是有正负零之分,然后就到补码了
补码:
正数的补码与原码相同,负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1.
---------------------------------------------------------
1.计算机中加法运算比减法运算实现起来简单很多,对反码做减法运算可以将被减数看作 加上被减数的负数形式,也就是将被减数出符号为取反。
2.在原码中,最高位是符号位。那么就存在正数0 -> 0000 0000 0000 0000,还存在负数0-> 1000 0000 0000 0000,这就存在两种0,反码也存在这个问题。 而在补码中,正数0 -> 0000 0000 0000 0000,假设存在负数0,那么按照补码的转换规则为 -> 1111 1111 1111 1111。可以看出这个数表示-2的15次方,不是-0,所以补码只有一个0。
-------------------------------------
经过验证为-2147483648 阶乘的最后存储不了变成负数了,是因为32bit存贮不了溢出了,应该说是往前移了,也就是把最开始的一个bit顶出去了。
----------------------------
浮点数结构
由此可以看出,在计算机中表示一个浮点数,其结构如下:
尾数部分(定点小数) 阶码部分(定点整数)
阶符± 阶码e 数符± 尾数m
这种设计可以在某个固定长度的存储空间内表示定点数无法表示的更大范围的数。
科学记数法以底数为?2?的小数来表示浮点数。32?位浮点数用?1?位表示数字的符号,用?8?位来表示指数,用?23?位来表示尾数,即小数部分。作为有符号整数的指数可以有正负之分。小数部分用二进制(底数?2?)小数来表示。对于64?位双精度浮点数,用?1?位表示数字的符号,用?11?位表示指数,52?位表示尾数。
-----------
最根本的原因,有些小数无法用二进制精确表示,比如0.1用二进制表示时,产生了循环,由于内存有限,只能近似存储0.1,所以内存中的0.1是0.1的近似值
先以一个题目来开头:
下列表达式中,可以得到精确结果的是(B)。
A. double d1 = 3.0 - 2.6;
B. double d4 = 2.5 * 1.5;
C. double d2 = 30/300;
D. double d3 = 1/2 + 0.5;
这个题目只有B能获得最终精确的结果是为什么呢?
这要观察小数在计算机里面的存储形式了
因为数据在计算机中存储的方法都是以二进制形式存储
由二进制的排列组合来得到不同的数据
那么小数也会使用二进制来存储。使用*2的方式来不断提取整数部分
A 3.0 的二进制形式 因为小数为0 所以只有整数部分011
2.6分为两部分,2的二进制为010
0.6的二进制为
0.6*2=1.2 取1
0.2*2=0.4 取0
0.4*2=0.8 取0
0.8*2=1.6 取1
所以会无限循环下去,错~ 因为double也是有取值范围的,所以会取一个近似值
依次类推,只有B可以得到。
所以当银行或者金融超市等地方需要精确值时,使用浮点数保存数据会出现问题。所以java提供了解决办法BigInteger和BigDecimal
BigDecimal使用方法将基本数据类型变成BigDecimal类型,然后使用增加乘除的方法来进行计算,提供了一系列运算方法
由于 BigDecimal 对象是不可变的,这些方法中的每一个都会产生新的 BigDecimal 对象。
因为创建对象的开销, BigDecimal 不适合于大量的数学计算,但设计它的目的是用来精确地表示小数
---------------------
本文来自 小笨笨大蛋蛋 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u010419438/article/details/39126809?utm_source=copy
java第二周的学习知识4(对原码,补码,反码和java中浮点数计算不准确的总结)的更多相关文章
- java第二周的学习知识2
sPrimitive() 判断是否为基本类型,Class.isPrimitive(),原始类型下返回true. for(Size value:Size.values()) { //此代码中的value ...
- java第二周的学习知识
1.java基本运行单位是类,类的组成成员为成员变量和方法.成员变量的种类有public,default(就是不写),protected,private.public:public可以修饰类,数据成员 ...
- java第二周的学习知识3(==与equals)
==与equals()的之间的差别1)对于==,如果作用于基本数据类型的变量,则直接比较其存储的 “值”是否相等:如果作用于引用类型的变量,则比较的是所指向的对象的地址 2)对于equals方法,注意 ...
- 从java toBinaryString() 看计算机数值存储方式(原码、反码、补码)
一.toBinaryString 方法及其含义 1.1 方法说明 该方法位于java.lang.Integer类中 方法签名:public static String toBinaryString(i ...
- 20165210 Java第二周学习总结
20165210 Java第二周学习总结 教材学习内容总结 - 第二章学习总结 标识符与关键字: 重点在50个关键字 标识符并不能是关键字 标识符的第一个字符不能是数字字符 Unicode字符集简单了 ...
- Java第二周作业
Java第二周作业 本周作业: 参考http://www.cnblogs.com/rocedu/p/7911138.html 学习第二三章视频 参考http://www.cnblogs.com/roc ...
- Java第二周总结报告
第二周的学习,开始正式实践进行Java的学习. 本周做了什么? 了解的Java的一些基本知识,如Java变量,数据类型和运算符等.Java变量对不同的数据类型最好采用不同的命名规则,合理的命名有利于提 ...
- java第二周的作业
package java第二周学习; import javax.swing.JOptionPane; public class 数学题 { private int a; private int b; ...
- 2018-03-11 20165235 祁瑛 Java第二周考试总结
20165235 祁瑛 Java第二周考试总结 课后习题p16 代码编写 class Person { void speakHello (){ System.out.print("nin h ...
随机推荐
- Install zeal on ubuntu16.04
Dash is a helpful software for macOS users. For Windows and Linux users, zeal is the open-source cou ...
- JAVA二分搜索树
二叉树: 和链表一样,动态数据结构. 二叉树具有唯一根节点 二叉树具有天然的递归结构 二分搜索树是二叉树 二分搜索树的每个节点的值: 1.大于其左子树的所有节点的值 2.小于其右子树的所有节点的值 每 ...
- Asp.Net MVC Ajax轮训解决Session失效时间
这种方法不是太好,对服务器得压力大,由于系统是内部人员使用,业务有比较复杂,所以有些值得需要Session去保存,但是,Session有失效时间. 代码如下: $(function () { func ...
- C# 正则表达式匹配盘符
if (!Regex.IsMatch(diskName, @"^[c-zC-Z](:\\)?$")) { throw new FormatException($"{dis ...
- VMware搭建虚拟机服务器
一.需求点描述: 1.在有路由器的情况下,能够通过固定的外网IP访问路由器中某台实体机中运行的虚拟机. 2.能够通过外网IP访问该虚拟机中的ftp.远程连接.iis.tomcat等. 二.原理分析: ...
- 实现虚拟机VMware上Centos操作系统与主机windows之间互相复制与粘贴
1.启动你的虚拟机,然后点击虚拟机,如下所示(未安装的话,显示的是安装VMware Tools): 2.点击安装Vmware tools以后显示如下所示: 3.VMwareTools-9.9.2-24 ...
- 一脸懵逼学习KafKa集群的安装搭建--(一种高吞吐量的分布式发布订阅消息系统)
kafka的前言知识: :Kafka是什么? 在流式计算中,Kafka一般用来缓存数据,Storm通过消费Kafka的数据进行计算.kafka是一个生产-消费模型. Producer:生产者,只负责数 ...
- [转] babel入门基础
背景 babel的官网说babel是下一代的js语法编译器,现在自己也在很多项目中使用了babel,可是自己对babel的认识呢,只停留在从google和别人项目中copy的配置代码上,内心感到很不安 ...
- javascript 相关小的知识点集合
本文主要是列出一些javascript 相关的,不限于javascript的,容易记错或者遗忘的小知识,小技巧. 1.javascript中的false 在 JavaScript,常见的 false ...
- php把一些预定义的 HTML 实体转换为字符。
htmlspecialchars_decode() echo htmlspecialchars_decode($condition,ENT_QUOTES) ' 会被转成 单引号