发布网友 发布时间:2022-04-23 00:53
共9个回答
懂视网 时间:2022-04-08 12:11
double、float都是浮点型。double(双精度型)比float(单精度型)存的数据更准确些,占的空间也更大。double精度是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.12345671234567123456712345671234)) from dual;
-987.12345671234567123456712345679 //包括小数点及负号位共40位
select to_char(func_test(9876.12345671234567123456712345671234)) from dual;
9876.12345671234567123456712345679 //4位整数+小数点+35位小数=40位
select to_char(func_test(987.12345671234567123456712345671234)) from dual;
987.1234567123456712345671234567 //3位整数+小数点+36位小数=40位
select to_char(func_test(12345671234567123456712345671234)) from dual;
12345671234567123456712345671234 //40位整数
select to_char(func_test(123456712345671234567123456712345)) from dual;
1.2345671234567123456712345679E+40 //41位时精度发生丢失
1.2345671234567123456712345679×10^40 即 123456712345671234567123456700000
float和double的范围和精度,Oracle的Number类型
标签:
热心网友 时间:2022-04-08 09:19
float有效数字位为6 – 7位,字节数为4,指数长度为8位,小数长度为23位。取值范围为 3.4E-38~3.4E+38。
double有效数字位为15 – 16位,字节数为8,指数长度为11位,小数长度为52位。取值范围为1.7E-308~1.7E+308。
扩展资料
可根据应用程序的需求将变量声明为 float 或 double。这两种类型之间的主要差异在于它们可表示的基数、它们需要的存储以及它们的范围。如果存储比精度更重要,对浮点变量使用 float 类型。相反,如果精度是最重要的条件,则使用 double 类型。
浮点变量可以提升为更大基数的类型(从 float 类型到 double 类型)。当您对浮点变量执行算术时,通常会出现提升。此算术始终以与具有最高精度的变量一样高的精度执行。
参考资料来源:百度百科——浮点型数据
热心网友 时间:2022-04-08 10:37
float和double是有IEEE标准的,不是C语言定的,其它语言也一样。
double型90%的情况下有效位是16位的10进制数据是对的。来一段lua程序:
local b= 9007199254740991
print("b="..string.format("%d", b))
for i=1,10 do
print("i="..i..",b+i="..string.format("%d", b+i))--打印的全是偶数
end
for i=1,10 do
print("i="..i..",b-i="..string.format("%d", b-i))--打印正确
end
由此可见,大于9007199254740991(2进制52位最大的数),从2^53开始误差就大于1。
热心网友 时间:2022-04-08 12:11
float double
二进制有效位数 24位 53位
十进制有效位数 6或7位 15或16位
因为2进制转化到10进制不是整的1000或10000的那种...所以float6位7位都有,double15位16位都有。
热心网友 时间:2022-04-08 14:03
准确来说是2^-15.
double尾数占52位,2^-52=2.2204460492503130808472633361816e-16,即2^-16,所以能够保证所有的15位精度。
热心网友 时间:2022-04-08 16:11
float是32位,double是位
float32位中,有1位符号位,8位指数位,23位尾数为
double位中,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位
这是我个人的一点看法,纯手打,希望能帮到你
热心网友 时间:2022-04-08 18:35
由于默认小数最多显示6位,我这里整数6位 再强制让输出小数点后14位 共20位
见程序
float可靠数据 算上整数部分只有7位 而double 有16位
热心网友 时间:2022-04-08 21:17
float double
二进制有效位数 24位 53位
十进制有效位数 7位 15位
热心网友 时间:2022-04-09 00:15
楼上的答案基本上是对的,不过还是有点小瑕疵
计算机中的浮点数用的是IEEE754标准,它的规定中:
1.
阶码用的是8位的移码,但是偏移用的是127,而不是128,并且全0和全1的阶码有特殊含义,所以阶码的实际取值范围是[1,254],然后再减去127得[-126,127],而不是楼上说的[-128,127]
2.
尾数部分是23位显示存储,实际上,为了多一位精度,它有一个隐含的1做为小数点前一位数字,这就是科学计数法,即如果尾数为1100,实际上是代表1.1100,所以尾数实际上是24位
当然这些都不太影响楼上说的精度的啦2^24 约为10^(24*log2)=10^7,所以有效数是7位
大家可以去查一下IEEE 754浮点数标准,会更清晰些