Visual c++ 如果不是整数值,则在数学运算中键入cast to double会给出令人困惑的结果

Visual c++ 如果不是整数值,则在数学运算中键入cast to double会给出令人困惑的结果,visual-c++,Visual C++,我正在VS2015-x64上运行一个小型MFC项目。只是检查浮动操作的结果 float fScale = 0.0199999996; float fOffset = 0; double doubleX2 = fOffset + 1 * fScale; 在“for()”循环中,只有fOffset从0更改为3000000。fScale始终保持不变 结果: fOffset doubleX2 0.000000 0.020000 63.00

我正在VS2015-x64上运行一个小型MFC项目。只是检查浮动操作的结果

float fScale = 0.0199999996;
float fOffset = 0;
    
double doubleX2 = fOffset + 1 * fScale;

在“for()”循环中,只有
fOffset
从0更改为3000000。fScale始终保持不变

结果:

fOffset            doubleX2
0.000000                0.020000
63.000000              63.020000
64.000000              64.019997
127.000000            127.019997
128.000000            128.020004
255.000000            255.020004
256.000000            256.019989
511.000000            511.019989
512.000000            512.020020
8191.000000          8191.020020
8192.000000          8192.019531
65535.000000        65535.019531
65536.000000        65536.023438
131071.000000      131071.023438
131072.000000      131072.015625
262143.000000      262143.015625
262144.000000      262144.031250
524287.000000      524287.031250
524288.000000      524288.000000
1999999.000000    1999999.000000
2999999.000000    2999999.000000
我不知道为什么小数部分会变化,最终变成零。 我一直希望小数部分是0.01999996。
但是如果我用双类型的方式来转换整数“1”,小数部分总是“020000”。< /P> < P>嗨,浮点是C++中的高值数据结构,它可以存储从3x10^ 38到+3x10^ 38的值。Double是另一种极高值的数据结构,存储在-1x10^308到+1x10^308之间。然而,与这些结构相比,Int很小

->Float的十进制精度约为6位,其中as Double的十进制精度为15位

->假设将900.0000000f转换为双倍,则存储在Double中的值将仅为900

->计算机用二进制将浮点数转换为十进制数,首先将浮点数转换为二进制数,所以将高精度的数字转换为二进制数会出现精度上的微小误差。 因此,您可能并不总是得到假定值。 在头文件中有一个名为std::setprecision(precision)的操纵器 您可以使用它来控制数字的精度

->如果计算是小数值或任何其他不重要的数值,则可以忽略此项。 如果你认为你需要精度,你仍然需要做误差分析

这个链接有很好的解释

如前所述,表达式在
float
中计算,然后在赋值时在末尾转换为
double
。如果将
1
更改为
1.0
,则整个表达式将在
double
中计算,并且精度损失不太明显
float
精确到~7位小数,
double
精确到~15位。