C++ 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的值是
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
的值是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;