2014-10-04 53 views
6

如果我使用C++代码:C++双待很长很长

long long d = 999999998.9999999994; 
cout<<d; 

我得到的输出:999999999(四舍五入)

但是这段代码的输出:

long long d = 999999998.9999994994; 
cout<<d; 

999999998 (四舍五入)

它是否与精度有关。有什么办法可以改变精确度吗? floor()函数也给出相同的输出。

我也注意到,如果我指定值8.99999949948.9999999994d(上面的变量)。输出是8

+0

您可以明确添加0.5,并将long double强制转换为double。 – 2014-10-04 19:42:42

+0

C++ 11支持?用户定义的文字可以提供帮助。 – Yakk 2014-10-04 20:52:15

+0

@OleksandrVerhun你可以做到这一点,但如果你的目标是将浮点数四舍五入到最接近的整数,你不应该这样做。 http://blog.frama-c.com/index.php?post/2013/05/02/nearbyintf1 – 2014-10-04 21:03:11

回答

10

999999998.9999999994不在double精确表示,因此实际值是上的999999998.9999999994任一侧上的两个可表示数字中的一个 - 无论是999999998.99999988079071044921875999999999(假设IEEE-754 binary64格式),在一个实现定义的方式选择。大多数系统默认会舍入到最近,产生999999999

最终的结果是,在你写这些系统时999999998.9999999994它最终会产生与编写999999999.0完全相同的效果。因此,后续转换产生999999999 - 从浮点数到整数的转换总是被截断,但这里没有任何要截断的内容。

对于999999998.9999994994,最接近的可表示数字是999999998.999999523162841796875999999998.99999940395355224609375。截断后任一个产生999999998。类似地,对于8.9999999994,最接近的可表示数字是8.9999999993999999503557774005457758903503417968758.9999999994000017267126168007962405681610107421875,并且在截断后任一人将产生8

4
long long d = 999999998.9999999994; 

最接近值999999998.9999999994double可以表示是999999999.0 - 记住,浮点具有有限精度)。
因此,截断小数位产生999999999,那就是d中保存的内容。

使用文字L -suffix确实导致999999998保存在d-long double具有更高的精度。

long long d = 999999998.9999994994; 

最接近值999999998.9999994994double可以代表实际上是低于999999999 - 我的机器上大约999999998.999999523。随后截断小数位数产生999999998,并存储在d中。