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 ...
随机推荐
- 用SQL语句查询zabbix的监控数据
参考地址:http://blog.51cto.com/sfzhang88/1558254 -- 获取主机id -- 10084 select hostid from hosts where host= ...
- DNS解析中的A记录、AAAA记录、CNAME记录、MX记录、NS记录、TXT记录、SRV记录、URL转发等
AA记录: 将域名指向一个IPv4地址(例如:100.100.100.100),需要增加A记录 NSNS记录: 域名解析服务器记录,如果要将子域名指定某个域名服务器来解析,需要设置NS记录 SOASO ...
- 解决Windows Server 2008R2通过计划任务定时执行bat文件,显示成功但实际未执行
前段时间在Windows Server 2008安装了一套基于MySQL数据库的软件,处于数据安全的考虑,希望每天能够自动进行数据库备份.我在别人脚本的基础上自己写了一个数据库备份的bat脚本,双击该 ...
- HL7体系入门级介绍【转】
HL7的简单介绍1)HL7 缩写于Health Level Seven,是创建于1987年,用来发展独立卫生保健行业的电子交换交换标准,经过多年的发展,HL7已经有多个版本, 目前我们 的集 ...
- 安装CentOS 7(转)
转载地址:https://www.cnblogs.com/wcwen1990/p/7630545.html CentOS7安装详解 本文基于vmware workstations进行CentOS7 ...
- sparkStreaming序列化问题
执行sparkSTreaming+kafka 报错如下: org.apache.spark.SparkException: Task not serializable ...... Caused by ...
- Codeforces 844F Anti-Palindromize 最小费用流
Anti-Palindromize 想到网络流就差不多了, 拆拆点, 建建边. #include<bits/stdc++.h> #define LL long long #define f ...
- Dataset:利用Python将已有mnist数据集通过移动像素上下左右的方法来扩大数据集为初始数据集的5倍—Jason niu
from __future__ import print_function import cPickle import gzip import os.path import random import ...
- 一、网络编程-UDP传输协议及socket套接字使用
知识点基本介绍:1.网络通信协议一般就是UDP和TCP俩种传输协议,这一章先说UDP,UDP是一种比较简单的传输协议,如qq使用的就是UDP 2.ip:ip就是标记网络中中的一台电脑 ...
- BZOJ BLO 1123 (割点)【双连通】
<题目链接> 以下内容转自李煜东的<算法竞赛进阶指南> 题目大意:现在给定一张连通的无向图,不包含重边.现在输出$n$个整数,表示将第$i$个节点的所有与其它节点相关联的边去掉 ...