`

java中的float和double的精度问题

阅读更多
1、背景知识
在java中没有细讲,只是讲了float占32位(bit),double占 64位。
对于计算机来说,用位数表示是合适的。但有人喜欢用字节(byte)表示。一个字节占8位。
1 byte = 8 bit.
所以float占4个字节,double占8个字节。
不过我还是喜欢用位数表示。这样更直接,也更容易理解计算机是怎么存储这些类型的。

对于精度和范围,还是参考一下c++吧。


2、存储知识
计算器存储浮点数的方法:(用科学计数法存储)
将要存的数先转换为小数(0.xxxxxx)x10的n次幂的形式进行存储。
例如:
3.1415 将被转换为:0.31415 x 10^1
100000 将被转换为:0.1 x 10^6

首先申明一点,先范围(有效数字位,包括整数位和小数位),再精度。


3、下面切入正题
=====================
在c++中单精度float类型与双精度double类型的问题

单精度float,在计算机中使用 32 bit (4个字节)来表示,具有7位十进制有效数字

分析:
在这 32 bit 中,
    - 1个bit表示符号位,
    - 8个bit表示指数位,
    - 剩下的23个bit是有效数字位。
      2的23次方是8388608,即7位十进制有效数字。


一个单精度的浮点数在内存当中占用了32个bit位,按照浮点数的表示标准,最高位表示符号,这32位一部分用来表示阶码,一部分用来表示小数部分。
按照这个表示方法转化成10进制之后,它能表示的最高精度是7位有效数字。

比如
float a=3.14159;a在内存中实际上表示为0.314159乘以10的1次方(0是符号位),而分配给a的存储单元就分为两部分,一部分存0.314159,一部分存指数1,而且也都是转化为2进制来存。



==================
float ,1位符号位, 8位指数位,23位尾数位
double,1位符号位,11位指数位,52位尾数位

float尾数位23位,2^23=8.3E6,7位,所以不同的编译器规定不同,有些是7位,有些8位
double尾数52位,2^52=4.5E15,15位,所以double的有效位数是15位








-------

后记:
数一下有效数字位数(整数位+小数位),7位以内的用float,15位以内的用double






但是还有一点小小的区别:

float f =  (float) 62345678.912345;  // => 6.234568E7  共 7 位
float f2 =  (float) 12345678.912345; // => 1.2345679E7 共 8 位







转自:
http://zhidao.baidu.com/question/415655003.html
http://zhidao.baidu.com/question/166445780.html


















--
分享到:
评论

相关推荐

    解决java数值范围以及float与double精度丢失的问题

    下面小编就为大家带来一篇解决java数值范围以及float与double精度丢失的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    Java中double类型下出现精度计算错误情况下出力方法

    Java中的简单浮点数类型float和double不能够进行运算,因为大多数情况下是正常的,但是偶尔会出现如上所示的问题。这个问题其实不是JAVA的bug,因为计算机本身是二进制的,而浮点数实际上只是个近似值,所以从二进制...

    关于java的数值精度

    java程序中数值的精度问题,float、double容易产生精度数值问题,不适合精度计算,而bigdecimal正好解决这一问题

    Java与MySQL中小数保存问题解析.pptx.pptx

    在Java和MySQL中,小数的精度可能会受到限制,如float类型的小数只能精确到6-7位,double类型也只能精确到15-16位。 浮点数运算问题 在进行浮点数运算时,可能会出现精度丢失的问题,例如0.1+0.2的结果并不等于0.3...

    Java Number & Math 类.pdf

    Java Number类提供了以下基本的数字操作:转换,比较,算术运算,取整,取余,取最大值和最小值,取绝对值,取幂,取对数,取根号,取随机数,取符号,取精度,取舍入值等。 三、什么是包装类? 在实际开发过程中,...

    Java-关于基本数据类型中浮点数计算产生的精度问题

    在基本数据类型中,float和double都表示浮点型数据,而计算机计算采取的是对二进制的计算,所以会存在一定程度上的精度丢失问题。 BigDecimal类是一个大小数操作类,可以用来对超过16位有效位的数据进行精确的运算,...

    float型和double型数据的存储方式1

    奇怪输出结果:首先我们看看2.25的单精度存储方式,2.25 --> 10.01 --> 1.001*21符号位0,指数部分1+127 --> 10000000

    Java中的浮点数分析

     浮点数分为单精度和双精度,Java中的单精度和双精度分别为float和double.你们知道float和double是怎么存储的吗? float占4个字节,double占8个字节,为了方便起见,这里就只讨论float类型. float其实和一个int型的...

    BigDecimal 加减乘除运算

    float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的...

    Java中各个数据类型之间的转换

    由于实际开发中这样的类型转换很多,所以Java语言在设计时,没有为该操作设计语法,而是由JVM自动完成。 转换规则 从存储范围小的类型到存储范围大的类型。 具体规则为: byte→short(char)→int→long→float→...

    java开发面试题及答案

    答:有问题,因为3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型,可能会造成精度损失,所以必须进行强制类型转换,正确的写法是float number =(float)3.4;/ float number =3.4F;。 Q3:...

    Java基础面试题.doc

    Java中的基本数据类型只有8个:byte、short、int、long、float、double、char、boolean;除了基本类型(primitive type)和枚举类型(enumeration type),剩下的都是引用类型(reference type)。 2、float f=3.4;...

    Java中BigDecimal的加减乘除、比较大小与使用注意事项

    对于不需要任何准确计算精度的数字可以直接使用float或double,但是如果需要精确计算的结果,则必须使用BigDecimal类,而且使用BigDecimal类也可以进行大数的操作,下面这篇文章给大家介绍了Java中BigDecimal的加减...

    浮点数的数据结构.pdf

    在JAVA中,通常使⽤的浮点数的类型为 FLoat和Double,他们的区别在于⼤⼩与储存⽅式不同 public class App { public static void main(String[] args) { System.out.println("Float:"+Float.SIZE); System.out....

    Android数据类型之间相互转换系统介绍

    一些初学Android的朋友可能会遇到JAVA的数据类型之间转换的苦恼,例如,整数和float,double型之间的转换,整数和String类型之间的转换,以及处理、显示时间方面的问题等。下面笔者就开发中的一些体会介绍给大家。 ...

    详谈javascript精度问题与调整

    在JS中数值类型就只有number类型,没有int,float,double之分,number类型实际上存储的就是IEEE754标准的浮点数,计算规则也是。 在表达式计算前,先要按照标准将两个数转成浮点数。 IEEE 754规定: 1.32位的浮点数...

    java-code Java语言程序.rar

    基本类型包括八种、布尔型(Boolean)、字节型(byte)、字符型(char)、短整型(short)、整型(integer)、长整型(long)、浮点型(float)、双精度型(double)。 引用类型包括:类(class)、接口(interface...

    Java八大基本类型详解

    Java有八大基本类型,其中包括4个整数类型,2个浮点类型,有个字符类型,1个布尔类型 八大基本类型及其包装类 ...float是单精度浮点数,double是双精度浮点数;double类型要比float类型的精度更高。 举个栗子:分别向

    单双精度转十六进制.zip

    单双精度浮点数与十六进制双向转换工具,单双精度浮点数与十六进制双向转换工具,单双精度浮点数与十六进制双向转换工具

    BigDecimalUtils

    float和double只能用来做科学计算或者是工程计算,在商业计算中要用java.math.BigDecimal。BigDecimal所创建的是对象,我们不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学运算,而必须调用其相对应的...

Global site tag (gtag.js) - Google Analytics