zoukankan      html  css  js  c++  java
  • Java 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

  • 相关阅读:
    Atitit 华为基本法 attilax读后感
    Atitit 华为管理者内训书系 以奋斗者为本 华为公司人力资源管理纲要 attilax读后感
    Atitit 项目版本管理gitflow 与 Forking的对比与使用
    Atitit 管理的模式扁平化管理 金字塔 直线型管理 垂直管理 水平管理 矩阵式管理 网状式样管理 多头管理 双头管理
    Atitit 乌合之众读后感attilax总结 与读后感结构规范总结
    深入理解 JavaScript 异步系列(4)—— Generator
    深入理解 JavaScript 异步系列(3)—— ES6 中的 Promise
    深入理解 JavaScript 异步系列(2)—— jquery的解决方案
    深入理解 JavaScript 异步系列(1)——基础
    使用 github + jekyll 搭建个人博客
  • 原文地址:https://www.cnblogs.com/kakaisgood/p/7404701.html
Copyright © 2011-2022 走看看