zoukankan      html  css  js  c++  java
  • float与double的范围和精度

    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

  • 相关阅读:
    轻重搭配
    EF的优缺点
    使用bootstrap-select有时显示“Nothing selected”
    IIS发布 HTTP 错误 500.21
    js添加的元素无法触发click事件
    sql server查看表是否死锁
    sql server把一个库表的某个字段更新到另一张表的相同字段
    SQLSERVER排查CPU占用高的情况
    SQL server中如何按照某一字段中的分割符将记录拆成多条
    LINQ to Entities does not recognize the method 'System.DateTime AddDays(Double)' method, and this method cannot be translated into a store expression.
  • 原文地址:https://www.cnblogs.com/BradMiller/p/1887945.html
Copyright © 2011-2022 走看看