C++ C++;浮点控制台输出问题 float x=384.951257; std::cout

C++ C++;浮点控制台输出问题 float x=384.951257; std::cout,c++,io,C++,Io,浮点值通常只有32位。每个十进制数字大约3位(210大约等于103),这意味着它不可能表示超过11个十进制数字,并且考虑到它还需要表示的其他信息,例如大小,比如说6-7个十进制数字。嘿,这就是你得到的 有关详细信息,请查看维基百科 使用double或long double以提高精度双是C++中的默认值。例如,文本3.14为double类型,浮点的分辨率有限。因此,当您将值分配到x时,它会四舍五入。这里的所有答案都认为问题是由于浮点数及其容量造成的,但这些只是实现细节;问题还不止于此。使用二进制表

浮点值通常只有32位。每个十进制数字大约3位(210大约等于103),这意味着它不可能表示超过11个十进制数字,并且考虑到它还需要表示的其他信息,例如大小,比如说6-7个十进制数字。嘿,这就是你得到的

有关详细信息,请查看维基百科


使用
double
long double
以提高精度<代码>双是C++中的默认值。例如,文本
3.14
double

类型,浮点的分辨率有限。因此,当您将值分配到
x

时,它会四舍五入。这里的所有答案都认为问题是由于浮点数及其容量造成的,但这些只是实现细节;问题还不止于此。使用二进制表示十进制数时会出现此问题。甚至像这样简单的事情,因为。不幸的是,这并不包括大多数可以用基数10表示为有限分数的数字,比如0.1

单精度
float
数据类型通常被映射为IEEE 754标准所称的数据类型,具有32位,分为1个符号位、8个指数位和23个有效位(不包括隐藏/隐式位)。因此,当转换为二进制32时,我们必须计算多达24位

这里的其他答案回避了实际的计算,我会尽力去做。对该方法进行了说明。因此,让我们将实数转换为二进制数:

整数部分384)10=110000000)2(使用通常的连续除以2的方法)

小数部分0.951257)10可以通过2的逐次乘法和整数部分进行转换

0.951257*2=1.902514

0.902514*2=1.805028

0.805028*2=1.610056

0.610056*2=1.220112

0.220112*2=0.440224

0.440224*2=0.880448

0.880448*2=1.760896

0.760896*2=1.521792

0.521792*2=1.043584

0.043584*2=0.087168

0.087168*2=0.174336

0.174336*2=0.348672

0.348672*2=0.697344

0.697344*2=1.394688

0.394688*2=0.789376

收集二进制中获得的分数部分,我们得到0.111100111000010)2。二进制的总数为110000000.111100111000010)2;根据需要,它有24位

将其转换回十进制将得到384+(15585/16384)=384.951232)10。启用舍入模式(舍入到最近)后,您将看到384.951263)10


这可以是。

正如我看到的
setprecision
不是std名称空间的成员。所以它不应该先运行。它是如何为您提供输出的?是的,它给出了那个输出,因为可能编译器正在舍入浮点值。@RavindraGupta
#include
,它就在那里。很好的解释!我只有一个问题,“符号”或“.”(我想知道这是什么11-7或8)@Digital_Reality:e.g.@cheerrandhth.-Alf:这里的问题不是精度,但不是所有的小数都能完全用二进制表示(见我的答案)。使用
double
long double
也无济于事@legends2k:你是对的,不是所有的小数都可以用二进制浮点表示,错误的是问题不是精度,错误的是
double
long double
没有帮助。你能告诉我错误的部分吗?即使有无限精度,也不能用二进制完全表示0.1。用计算来描述它。当然,对于精度更高的数据类型,可以得到很好的近似值,但这并不意味着可以完全表示它们。
float x = 384.951257;
std::cout << std::fixed << std::setprecision(6) << x << std::endl;