C++ C++;双到长

C++ C++;双到长,c++,floating-point,double,floating-point-conversion,C++,Floating Point,Double,Floating Point Conversion,如果我用c++编写代码: long long d = 999999998.9999999994; cout<<d; is9999999 8(向下舍入) 这与精确性有关吗。有什么办法可以改变精度吗floor()函数也提供相同的输出 我还注意到,如果我将值8.9999994994或8.99999994 4赋给d(上述变量)。输出为8 long long d = 999999998.9999999994; double可以表示的最接近99999999 8.999999999 4的值是

如果我用c++编写代码:

long long d = 999999998.9999999994;
cout<<d;
is
9999999 8
(向下舍入)

这与精确性有关吗。有什么办法可以改变精度吗
floor()
函数也提供相同的输出

我还注意到,如果我将值
8.9999994994
8.99999994 4
赋给
d
(上述变量)。输出为
8

long long d = 999999998.9999999994; 
double
可以表示的最接近
99999999 8.999999999 4
的值是
99999999 0
-请记住,浮点具有有限精度;)
因此,截断小数位会产生
9999999
,这就是保存在
d
中的内容

使用带有
L
-后缀的文本确实会导致
9999999 8
保存在
d
-
长双精度中

long long d = 999999998.9999994994;

double
可以表示的最接近
9999999999 8.9999999 4994
的值实际上低于
99999999
——大约
9999999 8.9999999 523
。截断小数位之后会产生
9999999 8
,并且存储在
d
9999999 8中。999999999 4
double
中不能精确表示,因此,实际值是
9999999 8.99999999 4
任一侧的两个可表示数字之一,即
99999999 8.99999999 8807071044921875
99999999
(假设IEEE-754
二进制64
格式),以实现定义的方式选择。默认情况下,大多数系统将四舍五入到最近的,生成
99999999

最终的结果是,在这些系统上,当您写入
9999999 8.999999999 4
时,它最终会产生与写入
9999999 0
完全相同的效果。因此,随后的转换将产生
9999999
——从浮点数到整数的转换总是会被截断,但这里没有什么可截断的


对于
9999999 8.9999999 4994
,最接近的可表示数字是
9999999 8.9999999 523162841796875
9999999 8.9999999 403953552224609375
。其中一个在截断后生成
9999999 8
。类似地,对于
8.999999999 4
,最接近的可表示数字是
8.99999999939999950355777400545775890350341796875
8.9999999994000017267126168007962405681610107421875
,其中任何一个都会在截断后生成
8

您可以显式地添加0.5并将double转换为long.C++11支持吗?用户定义的文字可能会有帮助。@OleksandrVerhun您可以这样做,但如果您的目标是将浮点数四舍五入到最接近的整数,则不应这样做@OleksandrVerhun如果您真的需要四舍五入到最接近的整数,请使用lrint()函数族。它们是POSIX和C99,由glibc和Visual Studio 2013支持。
long long d = 999999998.9999994994;