Java学习_ 基本数据类型_float

基于STM32的智能台灯PWM调光与人体感应融合设计 本文详细介绍了基于STM32单片机的智能台灯设计方案,重点讲解了PWM调光技术与人体感应模块的融合实现。通过STM32的高级定时器产生精准PWM信号控制LED亮度,结合红外传感器实现人来灯亮、人走灯灭的智能体验,同时集光敏传感实现环境自适应调光,打造高效节能的智能照明解决方案。 阅读详情

博客内容仅作学习/交流/参考之用,详细内容参见更多网络资源,欢迎大家交流探讨;

为防止经典/实用文章链接丢失,或不易查找,对部分文章全文转载。如果内容信息侵犯了你的合法权益,请告知我,我将及时处理。

E-Mail:dwang2014#hotmail.com(# ——> @)

Java data type

数据类型

关键字

内置类

内存占用字节数

可存储的取值范围

默认值

布尔型

boolean

Boolean

1字节

true,false

false

字符型

char

Character

2字节

16位Unicode字符,可容纳各国字符集。Unicode范围为‘\u0000’到‘ufff’。整数范围是0~65535。例如,65代表‘A’,97代表‘a’

‘\u0000’

Null

字节型

byte

Byte

1字节

-128~127

(-27~27-1)

0

短整型

short

Short

2字节

-32768~32767

(-215~215-1)

0

整形

int

Integer

4字节

-231~231-1

0

长整型

long

Long

8字节

-263~263-1

0

单精度型

float

Float

4字节

 

0.0F

双精度型

double

Double

8字节

 

0.0D


对于float和double数据类型精度丢失问题,在‘Effective Java’一书中也提到:float和double只能用来做科学计算或者工程计算(why?),在商业计算中我们要用java.math.BigDecimal。如果我们需要精确计算,非要用String来构建BigDecimal不可!

对于float和double数据类型的取值范围,以及精度,可参考以下文章:

[1].source:《Java中float的取值范围》,author:treeroot

[2].soure:《【解惑】剖析float型的内存存储和精度丢失问题》,author:Heart.X.Raid

[3].source:《java中的float和double的精度问题》,author:lixh1986

[4].source:《精确计算java中float和double的精度》,author:jiangfuqiang

[5].source:《Java中float的取值范围 》,author:nx0010

[6].source:《java基础之面试篇三---int,float,long,double取值范围,内存泄露》,author:nannan408


float和double数据类型的地城数据存储结构不一样:

计算机系统采纳了所谓的浮点数表达方式。这种表达方式利用科学计数法来表达实数,即用一个尾数(Mantissa也叫有效数字 ),一个基数(Base),一个指数(Exponent)以及一个表示正负的符号来表达实数。浮点数利用指数达到了浮动小数点的效果,从而可以灵活地表达更大范围的实数。

float:
1bit(符号位),8bits(指数位),23bits(尾数位)
double:
1bit(符号位),11bits(指数位),52bits(尾数位)


Java中double类型的格式基本遵循IEEE 754标准。尽管数学意义上的小数是连续的,但double仅仅能表示其中的一些离散点,把这些离散点组成的集合记为S,S的大小还是有限的。如果要保存的小数P刚好在集合S内,那么double类型就能精确的表示P;否则double类型只能从集合S中找一个与P最近的离散点P'代替P。

以上表述对于float也成立。IEEE 754中float和double的表示策略完全相同,区别仅仅体现在各个字段(指数字段、小数字段)的bit数量不同。


=======分割线,实用文章转载,了解float存储结构,明白取值范围和精度丢失问题========

《【解惑】剖析float型的内存存储和精度丢失问题


问题提出:12.0f-11.9f=0.10000038,"减不尽"为什么?

 现在我们就详细剖析一下浮点型运算为什么会造成精度丢失?

 

1、小数的二进制表示问题

       首先我们要搞清楚下面两个问题:

     (1)  十进制整数如何转化为二进制数

           算法很简单。举个例子,11表示成二进制数:

                     11/2=5   余   1

                       5/2=2   余   1

                       2/2=1   余   0

                       1/2=0   余   1

                          0结束         11二进制表示为(从下往上):1011

          这里提一点:只要遇到除以后的结果为0了就结束了,大家想一想,所有的整数除以2是不是一定能够最终得到0。换句话说,所有的整数转变为二进制数的算法会不会无限循环下去呢?绝对不会,整数永远可以用二进制精确表示 ,但小数就不一定了。

      (2) 十进制小数如何转化为二进制数

           算法是乘以2直到没有了小数为止。举个例子,0.9表示成二进制数

                     0.9*2=1.8   取整数部分  1

                     0.8(1.8的小数部分)*2=1.6    取整数部分  1

                     0.6*2=1.2   取整数部分  1

                     0.2*2=0.4   取整数部分  0

                     0.4*2=0.8   取整数部分  0

                     0.8*2=1.6   取整数部分  1

                     0.6*2=1.2   取整数部分  0

                              .........      0.9二进制表示为(从上往下): 1100100100100......

           注意:上面的计算过程循环了,也就是说*2永远不可能消灭小数部分,这样算法将无限下去。很显然,小数的二进制表示有时是不可能精确的 。其实道理很简单,十进制系统中能不能准确表示出1/3呢?同样二进制系统也无法准确表示1/10。这也就解释了为什么浮点型减法出现了"减不尽"的精度丢失问题。

 

2、 float型在内存中的存储 

     众所周知、 Java 的float型在内存中占4个字节。float的32个二进制位结构如下

           

         float内存存储结构   

                 4bytes          31                  30            29----23        22----0         

                        表示       实数符号位      指数符号位        指数位          有效数位

        其中符号位1表示正,0表示负。有效位数位24位,其中一位是实数符号位。

 

         将一个float型转化为内存存储格式的步骤为:

        (1)先将这个实数的绝对值化为二进制格式,注意实数的整数部分和小数部分的二进制方法在上面已经探讨过了。 
     (2)将这个二进制格式实数的小数点左移或右移n位,直到小数点移动到第一个有效数字的右边。 
     (3)从小数点右边第一位开始数出二十三位数字放入第22到第0位。 
     (4)如果实数是正的,则在第31位放入“0”,否则放入“1”。 
     (5)如果n 是左移得到的,说明指数是正的,第30位放入“1”。如果n是右移得到的或n=0,则第30位放入“0”。 
     (6)如果n是左移得到的,则将n减去1后化为二进制,并在左边加“0”补足七位,放入第29到第23位。如果n是右移得到的或n=0,则将n化为二进制后在左边加“0”补足七位,再各位求反,再放入第29到第23位。

 

          举例说明: 11.9的内存存储格式

       (1) 将11.9化为二进制后大约是" 1011. 1110011001100110011001100..."。

       (2) 将小数点左移三位到第一个有效位右侧: "1. 011 11100110011001100110 "。 保证有效位数24位,右侧多余的截取(误差在这里产生了 )。

       (3) 这已经有了二十四位有效数字,将最左边一位“1”去掉,得到“ 011 11100110011001100110 ”共23bit。将它放入float存储结构的第22到第0位。

       (4) 因为11.9是正数,因此在第31位实数符号位放入“0”。

       (5) 由于我们把小数点左移,因此在第30位指数符号位放入“1”。

       (6) 因为我们是把小数点左移3位,因此将3减去1得2,化为二进制,并补足7位得到0000010,放入第29到第23位。

 

           最后表示11.9为:  0 1 0000010 011 11100110011001100110

 

           再举一个例子:0.2356的内存存储格式
      (1)将0.2356化为二进制后大约是0.00111100010100000100100000。 
      (2)将小数点右移三位得到1.11100010100000100100000。 
      (3)从小数点右边数出二十三位有效数字,即11100010100000100100000放
入第22到第0位。 
      (4)由于0.2356是正的,所以在第31位放入“0”。 
      (5)由于我们把小数点右移了,所以在第30位放入“0”。 
      (6)因为小数点被右移了3位,所以将3化为二进制,在左边补“0”补足七
位,得到0000011,各位取反,得到1111100,放入第29到第23位。 
       

           最后表示0.2356为:0 0 1111100 11100010100000100100000

 

           将一个内存存储的float二进制格式转化为十进制的步骤: 
     (1)将第22位到第0位的二进制数写出来,在最左边补一位“1”,得到二十四位有效数字。将小数点点在最左边那个“1”的右边。 
     (2)取出第29到第23位所表示的值n。当30位是“0”时将n各位求反。当30位是“1”时将n增1。 
     (3)将小数点左移n位(当30位是“0”时)或右移n位(当30位是“1”时),得到一个二进制表示的实数。 
     (4)将这个二进制实数化为十进制,并根据第31位是“0”还是“1”加上正号或负号即可。

 

3、浮点型的减法运算

 

          浮点加减运算过程比定点运算过程复杂。完成浮点加减运算的操作过程大体分为四步:   
   (1) 0操作数的检查;

                如果判断两个需要加减的浮点数有一个为0,即可得知运算结果而没有必要再进行有序的一些列操作。 

  (2) 比较阶码(指数位)大小并完成对阶;

                两浮点数进行加减,首先要看两数的 指数位 是否相同,即小数点位置是否对齐。若两数 指数位 相同,表示小数点是对齐的,就可以进行尾数的加减运算。反之,若两数阶码不同,表示小数点位置没有对齐,此时必须使两数的阶码相同,这个过程叫做对阶 

                如何对 阶(假设两浮点数的指数位为 Ex 和 Ey ):

        通过尾数的移位以改变 Ex 或 Ey ,使之相等。 由 于浮点表示的数多是规格化的,尾数左移会引起最高有位的丢失,造成很大误差;而尾数右移虽引起最低有效位的丢失,但造成的误差较小,因此,对阶操作规定 使尾数右移,尾数右移后使阶码作相应增加,其数值保持不变。很显然,一个增加后的阶码与另一个相等,所增加的阶码一定是小阶。因此在对阶时,总是使小阶向大阶看齐 ,即小阶的尾数向右移位 ( 相当于小数点左移 ) ,每右移一位,其阶码加 1 ,直到两数的阶码相等为止,右移的位数等于阶差 △ 。 
   (3) 尾数(有效数位)进行加或减运算;

               对阶完毕后就可 有效数位 求和。 不论是加法运算还是减法运算,都按加法进行操作,其方法与定点加减运算完全一样。 
   (4) 结果规格化并进行舍入处理。

                

 

        浮点数的加减法:具体见http://www.zzslxx.com/wmy/jy/Chap02/2.7.1.htm

 

4、 计算12.0f-11.9f 

    12.0f 的内存存储格式为:    1 0000010 10000000000000000000000     

     11.9f 的内存存储格式为:     1 0000010 011 11100110011001100110


     可见两数的指数位完全相同,只要对有效数位进行减法即可。

     12.0f-11.9f   结果:         1 0000010 00000011001100110011010

      

     将结果还原为十进制为: 0.000 11001100110011010= 0.10000038


站在巨人的肩上才能看得更远,一步一个脚印才能走得更远。分享成长,交流进步,转载请注明出处!

JAVA中对浮点型数字进行加减乘除 import java.util.Scanner; public class javahomerwork2 { public static void main(String[] args) { float a,b;//使用String的时候,那就字符串形式 与下面的next要用nextfloat返回浮点型。 Scanner sc=new Scanner(System.in);//构造一个类 System.out.print("a="); 阅读详情

相关推荐

拉曼光谱入门:5.表面增强与共振增强

拉曼散射效应因其弱信号特性限制了传统拉曼光谱术的检测灵敏度。为克服这一局限,表面增强拉曼光谱术(SERS)和共振增强拉曼光谱术(RRS)被开发出来,显著提升了信号强度。SERS通过金属表面的电磁和化学效应放大信号,而RRS则通过匹配激发光波长与分子电子跃迁波长来增强信号。这两种技术扩大了拉曼光谱的应用范围,尤其在低浓度和微量试样分析中表现出色,尽管在实验操作和试样损伤方面存在挑战。

qq_53529450的博客 1428

java基础浮点类型

我们在现实生活中经常用到10进制的数据,比如整数和小数。但是小数经常出现小数点后无限循环的情况。比如圆周率的π和1/3。这些数字想要存入计算机中。我们只能使用doublefloat来存储。但是计算机的内存不是无限的。我们不可能真正的存储下这些数字。float:单精度,占用4个字节的内存空间,也就是4*8=32位二进制。double:双精度,占用8个字节的内存空间,也就是8*8=64位的二进制。

huyiju的博客 4205

商业银行风险预警平台系统项目解决方案.docx

商业银行风险预警平台系统项目解决方案.docx

java 浮点数 类型_Java 浮点类型

Java教程 - Java浮点类型float类型float类型表示单精度数字。float类型变量在需要一个分数组件时很有用。下面是一些浮动变量声明的例子:float high, low;Java浮点值,大小和字面值float是32位宽,其范围约为1.4e-045至3.4e + 038。Java中的浮点字面值默认为双精度。要指定浮点字面值,必须在该常量后面附加一个F或f。以下代码显示了如何声明浮点...

weixin_30753213的博客 830

Java如何创建float类型变量?

为什么创建float变量要加上f? 创建float类型变量,并且初始化:float f1 = 125.8f 注意:初始化float变量的时候,后面要加上"f"。 如果不加"f",则系统会默认该变量为double类型 float 数据类型是单精度、32位、符合IEEE 754标准的浮点数; float 在储存大型浮点数组的时候可节省内存空间; 默认值是 0.0f; 浮点数不能用来表示精确的值,如货币; 延申: doubledouble 数据类型是双精度、64 位、符合IEEE 754标准的浮点数; 浮点数

ZhaZha__Hui的博客 7000

Java中的数据类型详解——float类型

FloatTest01.java /* 关于java语言中的浮点型数据 浮点型包括: float 4个字节 double 8个字节 float是单精度 double是双精度 double更精确 比如说: 10.0 / 3 如果采用float来存储的话结果可能是:3.33333 10.0 / 3 如果采用double来存储的话结果可能是:3.3333333333 但是需要注意的是,如果用在银行方面或者说使用在财务方面,double 也是远远不够

Amlynooto的博客 9540

Java 基本数据类型

Java语言提供了八种基本类型。六种数字类型(四个整数型,两个浮点型),一种字符类型,还有一种布尔型

qq_51223298的博客 134

Java 基本数据类型与包装类之间的转换(1)

针对以上面试题,小编已经把面试题+答案整理好了。

shenliba的博客 1440

万剑归宗,到底什么是Java基本数据类型啊?

Java架构进阶面试及知识点文档笔记这份文档共498页,其中包括Java集合,并发编程,JVM,Dubbo,Redis,Spring全家桶,MySQL,Kafka等面试解析及知识点整理Java分布式高级面试问题解析文档其中都是包括分布式的面试问题解析,内容有分布式消息队列,Redis缓存,分库分表,微服务架构,分布式高可用,读写分离等等!互联网Java程序员面试必备问题解析及文档学习笔记Java架构进阶视频解析合集《一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频+实战项目源码》

2401_84046677的博客 696

Java 基本数据类型与包装类之间的转换

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数Java工程师,想要提升技能,往往是自己摸索长,自己不体系的自学效果低效漫长且无助。因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

2401_84831804的博客 1081

Java的8大基本数据类型

我们要把真实世界的东西表示在代码中,需要的就是数据的展示形式。也就是我们编程语言中的变量数据类型Java提供了8种基本类型Java的8大基本数据类型以及它们的包装类 8种基本数据类型 byte 、short、 int 、double 、char、 long 、float、 boolean 其中6种数字型、一种字符类型、还有一种布尔型。 6种数字类型中 byte sh、ort、 int、long 是整数型, doublefloat是浮点型(小数)。字符型char,布尔型boolean。 基本类型

Aa112233aA1的博客 941

JAVA的基础数据类型

JAVA的基础数据类型 最近在学习java,为了避免学了就忘,定期回顾一下。如果有错误的地方,欢迎指正 Java基本数据类型有8种: 类别 数据类型 内存 范围 整数相关 byte 1个字节 -128~127 整数相关 short 2个字节 -32768~32767 整数相关 int 4个字节 -2147483648~2147483647 整数相关 long 8个字...

bigear_yu的博客 226

JAVA—05 变量定义

一、变量定义 类型 位数 占用内存 值范围 默认值 整数型(int) 32位 4字节 [-232,232 -1](稍大于20亿) 0 短整数型(short) 16位 2字节 [-216,216 -1 ] 0 长整数型(long) 64位 8字节 [-264,264 -1 ] 0 字节型(byte) 8位 1字节 [-128,127 ] 0 浮点数型(float) 32位 4字节 [1.4E-45 (2的-149次方),3.4028235E38 (2的128次方-1) ] 0

博客 2745

java基本语法——变量

Java定义数据类型 一、变量按照数据类型来分: 基本数据类型: 整型:byte、shor、int、long 浮点型:floatdouble 字符型:char 布尔型:boolean 1、整型:byte(1字节=8bit) short(2字节) int(4字节) long(8字节) ①byte范围:-128~127 ②声明long型变量,必须以“l”或“L”结尾。(不加时将自动转换为int类型,整数大时出现过大整数的编译失败) ③通常,定义整型变量时,使用int型。 2、浮点型:float(4字节) d

MoerPerfect的博客 6412

Javafloat_javafloat什么意思?

float的意思是“浮动”,是java中的浮点型数据类型,用于存储单精度浮点数,默认值是“0.0f”,内存分配4个字节,占32位,有效小数位6-7位。float在储存大型浮点数组的时候可节省内存空间;浮点数不能用来表示精确的值,如货币。javafloat什么意思?javafloat的意思:float是单精度浮点数,内存分配4个字节,占32位,有效小数位6-7位。float 数据类型是单精度、3...

weixin_35577004的博客 3287

java float 详解_Java基本类型详解

在现实生活中,我们能够接触的到信息有很多种,有文字的,有数字的,有图片的,有声音的,还是视频的,这些信息我们随处可见,可以说我们离不开这些信息。现代的人们离不开计算机,计算机能够帮我们处理很多信息,不管是声音的、文字的还是数字的,它能够轻易快速的处理,计算机之所以能够处理这些信息,是因为它安装了程序的原因,程序能够帮助我们解决实际的问题,所以,程序是可以分辨出这些信息的。我们知道计算机只内部只认识...

weixin_36403165的博客 1万+

float java_Java Float

float java Java Float类 (Java Float Class) The Float class wraps a value of primitive type float in an object. An object of type Float contains a single field whose type is float. Float类将原始类型float的值包...

cunfen6312的博客 2280

java 定义float变量_Java定义float变量时,为什么必须加f?

今天舍友问到的一个小问题,也是很多同学在初学Java中,都会碰到的一个问题首先,我们查看代码的报错举例packagetv.zhangjia.FloatDemo;publicclassTest{publicstaticvoidmain(String[]args){doubled=1.2;floatf=1.2;//编译报错:Typemismatch:cannotco...

weixin_39639698的博客 5365
上一篇: 初识持续集成(Continuous Integration)
下一篇: Java学习_运算符优先级
普通玩家
博客等级 码龄12年 9粉丝 14原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值