精华内容
下载资源
问答
  • 红颜丽人 追求技术就像追求爱情! 跳至内容 博客首页  JAVA程序开发  LINUX系统学习  ...java浮点类型float精度与Double精度范围实例使用说明 ...java浮点类型float精度与Double精度范围实例

    红颜丽人

    追求技术就像追求爱情!

    跳至内容

    java浮点类型float精度与Double精度范围实例使用说明

    <iframe id="cproIframe_u1483260_1" width="300" height="250" src="http://pos.baidu.com/acom?adn=3&at=166&aurl=&cad=1&ccd=24&cec=UTF-8&cfv=17&ch=0&col=zh-CN&conOP=0&cpa=1&dai=1&dis=0&layout_filter=rank%2Ctabcloud&ltr=https%3A%2F%2Fwww.baidu.com%2Flink%3Furl%3D9fZyU0SdgLBGxhBge2R6kwyyz0Y82dwS6z6tu_-vjWxBZfY16fWqgpMJY4NlkqR8%26ie%3Dutf-8%26f%3D8%26tn%3Dbaidu%26wd%3Ddouble%2520d%2520%253D.314%253B%26bs%3DMath.random()&ltu=http%3A%2F%2Fwww.hongyanliren.com%2F1658.html&lunum=6&n=87026039_cpr&pcs=1249x607&pis=10000x10000&ps=356x156&psr=1440x900&pss=1249x504&qn=9f336074cd61fba2&rad=&rsi0=300&rsi1=250&rsi5=3&rss0=%23FFFFFF&rss1=%23FFFFFF&rss2=%230000FF&rss3=%23444444&rss4=%23008000&rss5=&rss6=%23e10900&rss7=&scale=&skin=&td_id=1483260&ti=java%E6%B5%AE%E7%82%B9%E7%B1%BB%E5%9E%8Bfloat%E7%B2%BE%E5%BA%A6%E4%B8%8EDouble%E7%B2%BE%E5%BA%A6%E8%8C%83%E5%9B%B4%E5%AE%9E%E4%BE%8B%E4%BD%BF%E7%94%A8%E8%AF%B4%E6%98%8E%20%7C%20%E7%BA%A2%E9%A2%9C%E4%B8%BD%E4%BA%BA&tn=text_default_300_250&tpr=1430103636974&ts=1&version=2.0&xuanting=0&dtm=BAIDU_DUP2_SETJSONADSLOT&dc=2&di=u1483260&tt=1430103636964.11.138.146" align="center,center" marginwidth="0" marginheight="0" scrolling="no" frameborder="0" allowtransparency="true" style="margin: 0px; padding: 0px; border-width: 0px; vertical-align: baseline; max-width: 100%;"></iframe>

    java浮点类型float精度与Double精度范围实例使用说明,浮点型是有误差的。

    类型
    占用存储空间
    表数范围
    Float
    4字节
    -3.403E38~3.403E38
    Double
    8字节
    -1.798E308~1.798E308

     

    ü      float类型又被称作单精度类型,尾数范围可以精确到7位有效数字,在很多情况下,float类型的精度很难满足需求。
    ü      double表示这种类型的数值精度是float类型的两倍,又被称作双精度,绝大部分应用程序都采用double类型。
    ü      Java 浮点类型常量有两种表示形式
    ü      十进制数形式,例如:
    3.14       314.0      0.314
    ü      科学记数法形式,如
    314e2      314E2      314E-2
           double f = 314e2;  //314*10^2–>31400.0
          double f2 = 314e-2; //314*10^(-2)–>3.14
    ü      Float类型的数值有一个后缀F/f ,没有后缀F/f的浮点数值默认为double类型。也可以在浮点数值后添加后缀D/d,以明确其为double类型:
    浮点类型float, double的数据不适合在不容许舍入误差的金融计算领域。
    如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal
    注:
              主要理由:由于字长有限,浮点数能够精确表示的数是有限的,因而也是离散的。浮点数一般都存在舍入误差,很多数字无法精确表示(例如0.1),其结果只能是接近, 但不等于。
    二进制浮点数不能精确的表示0.1,0.01,0.001这样10的负次幂。并不是所有的小数都能可以精确的用二进制浮点数表示。
    最好完全避免使用浮点数比较:
            float f = 0.1f;
           double d = 1.0/10;
           System.out.println(f==d);   //false
           float d1 = 423432423f;
           float d2 = d1+1;
           if(d1==d2){
               System.out.println(“d1==d2″);
           }else{
               System.out.println(“d1!=d2″);
           }
    记住:浮点数不要用于比较。由于其是近似存储,值越大,精度损失越大,越不精确!
    大数值:
    Java.math下面的两个有用的类:BigIntegerBigDecimal,这两个类可以处理任意长度的数值。BigInteger实现了任意精度的整数运算。BigDecimal实现了任意精度的浮点运算。
    浮点数使用总结:
    1.   默认是double
    2.   浮点数存在舍入误差,很多数字不能精确表示。如果需要进行不产生舍入误差的精确数字计算,需要使用BigDecimal类。
    3.   避免比较中使用浮点数

     

    课堂代码:
    1. //测试浮点数
    2. public class TestFloatType {
    3.    public static void main(String[] args){
    4.       //double d = 3.14;   //浮点数常量默认类型是double。
    5.       //float f = 6.28F;
    6.       double d2 = 314e-2;   //采用科学计数法的写法
    7.       System.out.println(d2);
    8.       float f = 0.1f;
    9.       double d = 1.0/10;
    10.       System.out.println(f==d);   //false
    11.    }
    12. }

    float精度与Double精度范围说明与讲解实例。

    展开全文
  • Java float和double精度范围大小

    万次阅读 2018-03-28 16:37:46
    要想理解float和double的取值范围和计算精度,必须先了解小数是如何在计算机中存储的: 举个例子:78.375,是一个正小数。要在计算机中存储这个数,需要把它表示为浮点数的格式,先执行二进制转换:   一 小数的...

    要想理解float和double的取值范围和计算精度,必须先了解小数是如何在计算机中存储的:

    举个例子:78.375,是一个正小数。要在计算机中存储这个数,需要把它表示为浮点数的格式,先执行二进制转换:

     

    一 小数的二进制转换(浮点数)

    78.375的整数部分:

    小数部分:

     

    所以,78.375的二进制形式就是1001110.011

    然后,使用二进制科学记数法,有

    注意,转换后用二进制科学记数法表示的这个数,有底有指数有小数部分,这个就叫做浮点数

     

    二 浮点数在计算机中的存储

    在计算机中,保存这个数使用的是浮点表示法,分为三大部分:

    第一部分用来存储符号位(sign),用来区分正负数这里是0,表示正数

    第二部分用来存储指数(exponent),这里的指数是十进制的6

    第三部分用来存储小数(fraction),这里的小数部分是001110011

    需要注意的是,指数也有正负之分,后面再讲。

    如下图所示(图片来自维基百科):

     

     

    比如float类型是32位,是单精度浮点表示法:

    符号位(sign)占用1位,用来表示正负数,

    指数位(exponent)占用8位,用来表示指数,

    小数位(fraction)占用23位,用来表示小数,不足位数补0。

     

    而double类型是64位,是双精度浮点表示法:

    符号位占用1位,指数位占用11位,小数位占用52位。

     

    到这里其实已经可以隐隐看出:

    指数位决定了大小范围,因为指数位能表示的数越大则能表示的数越大嘛!

    而小数位决定了计算精度,因为小数位能表示的数越大,则能计算的精度越大咯!

     

    可能还不够明白,举例子吧:

    float的小数位只有23位,即二进制的23位,能表示的最大的十进制数为2的23次方,即8388608,即十进制的7位,严格点,精度只能百分百保证十进制的6位运算。

    double的小数位有52位,对应十进制最大值为4 503 599 627 370 496,这个数有16位,所以计算精度只能百分百保证十进制的15位运算。

    作者:Boss呱呱
    链接:https://www.zhihu.com/question/46432979/answer/221485161
    来源:知乎
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    三 指数位的偏移量与无符号表示

    需要注意的是指数可能是负数,也有可能是正数,即指数是有符号整数,而有符号整数的计算是比无符号整数麻烦的。所以为了减少不必要的麻烦,在实际存储指数的时候,需要把指数转换成无符号整数。那么怎么转换呢?

    注意到float的指数部分是8位,则指数的取值范围是 -126到+127,为了消除负数带来的实际计算上的影响(比如比较大小,加减法等),可以在实际存储的时候,给指数做一个简单的映射,加上一个偏移量,比如float的指数偏移量为127,这样就不会有负数出现了

    比如

    指数如果是6,则实际存储的是6+127=133,即把133转换为二进制之后再存储。

    指数如果是-3,则实际存储的是-3+127=124,即把124转换为二进制之后再存储。

    当我们需要计算实际代表的十进制数的时候,再把指数减去偏移量即可。

    对应的double类型,存储的时候指数偏移量是1023。

    四 最后

    所以用float类型来保存十进制小数78.375的话,需要先转换成浮点数,得到符号位指数小数部分。这个例子前面已经分析过,所以:

    符号位是0,

    指数位是6+127=133,二进制表示为10 000 101,

    小数部分是001110011,不足部分请自动补0。

    连起来用float表示,加粗部分是指数位,最左边是符号位0,代表正数:

    0 10000101 001110011 00000 00000 0000

    如果用double来保存。。。自己计算吧,太多0了。

     

    作者:Boss呱呱
    链接:https://www.zhihu.com/question/46432979/answer/221485161

     

    展开全文
  • float是32位,double是64位 float32位中,有1位符号位,8位指数...同理double范围约是-1.7E308—1.7E308,楼主可以自己按下计算器试试看,印象深些 精度是看尾数部分 float尾数位23位,2^23=8.3E6,7位,所以不同的编译

    float是32位,double是64位
    float32位中,有1位符号位,8位指数位,23位尾数为
    double64位中,1位符号位,11位指数位,52位尾数位
    取值范围看指数部分
    float是有符号型,其中,8位指数位,2^8=(-128—127),因此实际的范围是-2^128—2^127,约为-3.4E38—3.4E38
    同理double范围约是-1.7E308—1.7E308,楼主可以自己按下计算器试试看,印象深些
    精度是看尾数部分
    float尾数位23位,2^23=8.3E6,7位,所以不同的编译器规定不同,有些是7位,有些8位
    double尾数52位,2^52=4.5E15,15位,所以double的有效位数是15位

    展开全文
  • float double精度范围

    2014-05-25 20:56:04
     float和double范围是由指数的位数来决定的。  float的指数位有8位,而double的指数位有11位,分布如下:  float:  1bit(符号位) 8bits(指数位) 23bits(尾数位)  double:  1bit(符号位) 11...

    1. 范围
      float和double的范围是由指数的位数来决定的。
      float的指数位有8位,而double的指数位有11位,分布如下:
      float:
      1bit(符号位) 8bits(指数位) 23bits(尾数位)
      double:
      1bit(符号位) 11bits(指数位) 52bits(尾数位)
      于是,float的指数范围为-127~+128,而double的指数范围为-1023~+1024,并且指数位是按补码的形式来划分的。
      其中负指数决定了浮点数所能表达的绝对值最小的非零数;而正指数决定了浮点数所能表达的绝对值最大的数,也即决定了浮点数的取值范围。
      float的范围为-2^128 ~ +2^128,也即-3.40E+38 ~ +3.40E+38;double的范围为-2^1024 ~ +2^1024,也即-1.79E+308 ~ +1.79E+308。

    2.  精度
      float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。
      float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;
      double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。

    3.Oracle中Number类型

    在Oracle中Number类型可以用来存储0,正负定点或者浮点数,可表示的数据范围在
    1.0 * 10(-130) —— 9.9...9 * 10(125) {38个9后边带88个0}
    的数字,当Oracle中的数学表达式的值>=1.0*10(126)时,Oracle就会报错。
    Number的数据声明如下:
    表示        作用        说明
    Number(p, s)        声明一个定点数        p(precision)为精度,s(scale)表示小数点右边的数字个数,精度最大值为38,
    Number(p)        声明一个整数        相当于Number(p, 0)
    Number        声明一个浮点数        其精度为38,要注意的是scale的值没有应用,也就是说scale的指不能简单的理解为0,或者其他的数。

    定点数的精度(p)和刻度(s)遵循以下规则:
    ?        当一个数的整数部分的长度 > p-s 时,Oracle就会报错
    ?        当一个数的小数部分的长度 > s 时,Oracle就会舍入。
    ?        当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。
    ?        当s > p 时, p表示小数点后第s位向左最多可以有多少位数字,如果大于p则Oracle报错,小数点后s位向右的数字被舍入

    4.验证
    create or replace function  func_test(p_type number) return number
    is
    /*
     功能:基于警度图数据同步
    */
     l_cnt number;
    begin
     select p_type into l_cnt from dual;
     return l_cnt;
    end func_test;
    /
    show err;

    5.结论

    number 的总长度是40位,其中可能包括:小数点,负号位。

    select to_char(func_test(-987.1234567891234567891234567891234567891234)) from dual;
    -987.12345678912345678912345678912345679   //包括小数点及负号位共40位
    select to_char(func_test(9876.1234567891234567891234567891234567891234)) from dual;
    9876.12345678912345678912345678912345679   //4位整数+小数点+35位小数=40位
    select to_char(func_test(987.1234567891234567891234567891234567891234)) from dual;
    987.123456789123456789123456789123456789   //3位整数+小数点+36位小数=40位
    select to_char(func_test(1234567891234567891234567891234567891234)) from dual;
    1234567891234567891234567891234567891234   //40位整数
    select to_char(func_test(12345678912345678912345678912345678912345)) from dual;
    1.2345678912345678912345678912345679E+40   //41位时精度发生丢失
    1.2345678912345678912345678912345679×10^40 即 12345678912345678912345678912345678900000

    展开全文
  • 转:C语言中关于float、double、long double精度及数值范围理解 http://blog.sina.com.cn/s/blog_6ebd49350101gdgo.html  C语言中关于float、double、longdouble精度及数值范围理解 (2013-09-27 10:29:23) ...
  • 在IEEE754标准中进行了单精度浮点数(float)和双精度数浮点数(double)的定义。float有32bit,double有64bit。它们的构成包括符号位、指数位和尾数位。 这些位的构成如下: 种类-------符号位-------------指数位---...
  •  float和double范围是由指数的位数来决定的。  float的指数位有8位,而double的指数位有11位,分布如下:  float:  1bit(符号位) 8bits(指数位) 23bits(尾数位)  double: 1bit(符号位) 11bits...
  • 数据精度问题 float与double范围精度
  • 下面小编就为大家带来一篇解决java数值范围以及float与double精度丢失的问题。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
  •  float和double范围是由指数的位数来决定的。  float的指数位有8位,而double的指数位有11位,分布如下:  float:  1bit(符号位) 8bits(指数位) 23bits(尾数位)  double:  1bit(符号位) 11...
  • double精度范围

    千次阅读 2014-04-10 09:47:25
    float与double范围精度 1. 范围  float和double范围是由指数的位数来决定的。  float的指数位有8位,而double的指数位有11位,分布如下:  float:  1bit(符号位) 8bits(指数位) 23bits(尾数...
  • double 精度

    千次阅读 2011-11-02 20:19:41
     float和double范围是由指数的位数来决定的。  float的指数位有8位,而double的指数位有11位,分布如下:  float:  1bit(符号位) 8bits(指数位) 23bits(尾数位)  double:  1bit(符号位) 11...
  • float和double范围精度

    千次阅读 2012-10-22 20:08:46
    float和double范围精度 float与double范围精度 1 范围 float和double范围是由指数的位数来决定的。 float的指数位有8位,而double的指数位有11位,分布如下: float: 1bit(符号位) 8bits...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 2,658
精华内容 1,063
关键字:

double精度范围