`
cruih
  • 浏览: 79868 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

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

 

分享到:
评论

相关推荐

    float double精度的详细解释

    ### float与double精度详解 #### 一、浮点数的基础概念 在计算机科学中,`float` 和 `double` 是两种常用的浮点数类型,它们主要用于处理实数运算。这两种类型的区别主要体现在精度和范围上。 #### 二、浮点数的...

    float和double

    float和double浮点数类型的精度和范围解析 浮点数类型float和double是编程语言中最常用的数值类型,但是它们的精度和范围却是程序员需要注意的重要问题。本文将详细解释float和double的范围和精度,及其在商业计算...

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

    解决java数值范围以及float与double精度丢失的问题 Java中的数值范围和浮点数精度问题是许多开发者经常遇到的问题。下面我们将详细探讨Java中的数值范围、float和double类型的精度问题,并且提供解决方案。 一、...

    基于C++浮点数(float、double)类型数据比较与转换的详解

    这是因为浮点数在内存中的二进制表示导致的,且`float`和`double`各有不同的精度限制。 2. **浮点数转换为字符串**: 使用`sprintf()`函数将浮点数转换为字符串时,需要注意精度控制。对于`float`,它的小数点前后...

    float、double类型介绍.zip

    这些文件与float和double的理论知识关联不大,但在实际编程环境中,理解这些文件的作用对于项目的构建和调试至关重要。 总结来说,float和double是编程中处理浮点数的关键数据类型,理解它们的表示方法、精度、误差...

    HEX-Float转换工具 16进制转成float 或double类型数据的一个小工具

    而浮点数则是一种科学计数法的二进制表示,用于存储可能的大范围和高精度数值。浮点数分为两部分:指数部分和尾数部分,它们都是二进制形式的。 在计算机中,根据IEEE 754标准,float和double类型的浮点数有不同的...

    十六进制(HEX)和浮点类型(float、double)转换工具

    这种表示方式允许它们在有限的存储空间内表示极大的或极小的数值范围,但同时会引入精度损失。 转换十六进制到浮点类型和反之的过程较为复杂,涉及到对二进制表示的理解。对于十六进制转浮点,首先要将十六进制转换...

    C#中float的取值范围和精度分析

    本文实例分析了C#中float的取值范围和精度。分享给大家供大家参考。具体分析如下: float类型的表现形式: 默认情况下,赋值运算符右侧的实数被视为 double。 因此,应使用后缀 f 或 F 初始化浮点型变量,如以下示例...

    float_double存储问题

    double 的存储方式与 float 的存储方式大同小异,不同的是指数部分和尾数部分的位数。 double 的指数部分为 11 位,尾数部分为 52 位。 通过上面的知识点,我们可以解决一些疑惑的问题。例如, float f = 2.2f; ...

    详解java中float与double的区别

    float 和 double 都可以用来表示实数,但是它们的精度和取值范围不同。 float 的精度是 8 位有效数字,取值范围是 10 的 -38 次方到 10 的 38 次方,而 double 的精度是 17 位有效数字,取值范围是 10 的 -308 次方...

    float_double_explicit.rar_float

    例如,将double强制转换为float可能会丢失部分信息,因为float的表示范围和精度都小于double。因此,使用“explicit”关键字进行类型转换可以防止隐式转换,从而避免潜在的错误。 gtest_pred_impl.c可能是Google ...

    C# 按照IEEE 754标准对Float和Double类型进行转换

    本话题主要聚焦于如何根据IEEE 754标准来处理和转换浮点数类型,包括`float`和`double`。IEEE 754是国际上广泛采用的一个标准,用于定义浮点数的存储格式,它规定了二进制浮点数的表示方法,包括正负号、指数和尾数...

    详解iOS之关于double/float数据计算精度问题

    本篇文章将详细介绍 iOS 中 double/float 数据计算精度问题的根源、解决方案和高精度计算方法。 一、double/float 数据计算精度问题的根源 在 iOS 开发中,我们经常使用 double 和 float 数据类型来表示小数。但是...

    浮点数的存储结构(double和float)

    3. **精度和范围**:由于`float`和`double`的位数不同,它们的精度和表示的数值范围也有所差异。`double`通常具有更高的精度和更大的数值范围,因此在需要更高精度的计算中更常被使用。 了解这些基础知识后,可以...

    C语言中floatdouble的区别.pdf

    在C语言中,float和double是两个基本的浮点类型,它们在存储方式、精度、数值范围等方面存在着明显的差异。 首先,float类型是单精度浮点数,它占用4个字节的内存空间,有效数字为6-7位,数值范围在-3.4*10(-38)到...

    十进制和十六进制转换成float、double数据

    本文将详细讲解如何将十进制和十六进制数值转换为浮点数(float)和双精度浮点数(double)。 首先,让我们从十进制开始。十进制是我们日常生活中最常用的计数系统,其基数为10。在MATLAB中,我们可以通过直接输入...

    Keil MDK-ARM各种数据类型占用的字节数 char short int float double

    6. **double**: 双精度浮点数`double`占用8个字节,提供更高的精度,可以表示大约15位有效数字的数值。 在进行移植和优化代码时,了解这些基本数据类型的大小对于内存管理、计算效率以及兼容性非常重要。例如,在...

Global site tag (gtag.js) - Google Analytics