2
回答
10.0除以7 为什么只能精确到14位小数点?
注册华为云得mate10,2.9折抢先购!>>>   

我在.Net环境下:

输出( 10.0 / 3 );

结果:3.33333333333333

为什么小数只能精确到14位呢?

备注:

而且用其他语言或不同的编译器结果都一样。

举报
loongchao
发帖于5年前 2回/356阅
共有2个答案 最后回答: 5年前

1 范围 

float和double的范围是由指数的位数来决定的。 
float的指数位有8位,而double的指数位有11位,分布如下: 
float:共32位 
1bit(符号位) 
8bits(指数位) 
23bits(尾数位) 


double:共 64位 


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位。
--- 共有 1 条评论 ---
loongchao2^23 这个是怎么来的呢。 (备注:float.MaxValue 会是很大的数字) 为什么你只有 2^23 8388608 呢? 这是7位没错,我用 float i= 10.0 / 3 等于7位的3.3333333 而 double i=10.0 / 3 等于3.33333333333333 5年前 回复
顶部