C++中float,double到底保留几位有效数字

int ival = 3;
float fval = 1.32121212f;
double dval = -45.67456554;
double dval2 = -4.456511111111111;
cout << ival << endl;
cout << fval << endl;
cout << dval << endl;
cout << dval2 << endl;

输出的结果是:
3
1.32121
-45.6746
-4.45651

疑问:为什么运行结果是double和float都显示6位有效数字,我记得double有十多位的啊。。

float精度是2^23,能保证6位。double精度是2^52,能保证15位。但是默认float和double都只能显示6位,再多需要#include <iomanip>,然后在输出语句之前插入cout << setprecision(20);强制输出小数位。

拓展资料

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位。

温馨提示:答案为网友推荐,仅供参考
第1个回答  推荐于2019-08-11

float精度是2^23,能保证6位。
double精度是2^52,能保证15位。
但是默认float和double都只能显示6位,再多需要#include ,然后在输出语句之前插入cout << setprecision(20);强制输出小数位。

float fval = 1.32121212f;
double dval = -45.67456554;
double dval2 = -4.456511111111111;
cout << fval << endl;
cout << dval << endl;
cout << dval2 << endl;
输出的结果是:
1.32121
-45.6746
-4.45651

扩展资料

结论:

    有些编译器 float的有效数字位是 8位 , 有些有效数字位是 7位

    有些编译器double的有效数字位是 15位, 有些是 16位

    注意printf(“%f”, x); // 默认输出6位小数(不要和有效数字混淆)

    分析

    C/C++编译器标准都遵照IEEE制定的浮点数表示法来进行float,double运算

    是float还是double,在内存中的存储主要分成三部分,分别是:

    (1)符号位(Sign): 0代表正数,1代表负数

    (2)指数位(Exponent): 用于存储科学计数法中的指数部分,并且采用移位存储方式

    (3)尾数位(Mantissa): 用于存储尾数部分

    float 是 32位, 其中有23位用于存放尾数, 带有一个固定隐含位.. 所以float的有24个二进制有效位位数.

    2^24共有8个十进制位. 所以有些编译器 float的有效数字位是 8位 , 有些有效数字位是 7位.(注意不是小数的位数, 是有效数字位)

    double也一样,是64位, 其中有52位用于存放尾数, 一个固定隐含位. 共有 53个二进制有效位位数.

    2^53次方有15个十进制位, 所以有些编译器double的有效数字位是15位, 有些是16位



本回答被网友采纳
第2个回答  推荐于2019-09-28

float精度是2^23,能保证6位。
double精度是2^52,能保证15位。
但是默认float和double都只能显示6位。

扩展资料

C++是C语言的继承,它既可以进行C语言的过程化程序设计,又可以进行以抽象数据类型为特点的基于对象的程序设计,还可以进行以继承和多态为特点的面向对象的程序设计。C++擅长面向对象程序设计的同时,还可以进行基于过程的程序设计,因而C++就适应的问题规模而论,大小由之。 

C++不仅拥有计算机高效运行的实用性特征,同时还致力于提高大规模程序的编程质量与程序设计语言的问题描述能力。

本回答被网友采纳
第3个回答  推荐于2019-08-14

int ival = 3;
float fval = 1.32121212f;
double dval = -45.67456554;
double dval2 = -4.456511111111111;
cout << ival << endl;
cout << fval << endl;
cout << dval << endl;
cout << dval2 << endl;

输出的结果是:
3
1.32121
-45.6746
-4.45651

【拓展资料】

C语言中float和double的区别

float为单精度,占4字节(32位)的内存空间,它的数值有效范围是-10的38次方到10的38次方,只表示7位有效数字。而double为双精度,8字节,正负10的308次方之间,能精确到16位。这应该就是他们的的最基本的区别吧。

本回答被网友采纳
第4个回答  推荐于2017-09-27
float精度是2^23,能保证6位。
double精度是2^52,能保证15位。
double精度的确有那么高,但是默认打印位数没有那么多。
先#include <iomanip>,然后在输出语句之前插入cout << setprecision(20);强行要求输出20位精度,就可以比较出float和double的精度差别了。追问

然后结果变成了:

3
1.3212121725082397
-45.674565540000003
-4.4565111111111113
额,怎么float和double都有17位了,后面那些拓展的怎么都不是我设置的大小啊

追答

这就是超出精度部分的误差。

float前6位一定和你设置的一样,double前15位一定和你设置的一样。这就是精度的含义。

追问

我试了float fval = 1.3f;显示的结果是1.2999999什么的啊。。。不是应该1.300000后面再误差吗。。

追答

四舍五入到六位有效数字,结果与原数相同,证明没问题。

本回答被提问者采纳