如果我用c ++编写代码:
long long d = 999999998.9999999994;
cout<<d;
我得到输出:999999999
(向上舍入)
但是这段代码的输出:
long long d = 999999998.9999994994;
cout<<d;
是999999998
(向下舍入)
是否与精确度有关。有什么方法可以改变精度。 floor()
函数也提供相同的输出。
我还注意到,如果我将值8.9999994994
或8.9999999994
分配给d
(上面的变量)。输出为8
。
答案 0 :(得分:10)
999999998.9999999994
在double
中无法准确表示,因此实际值是999999998.9999999994
任意一侧的两个可表示数字之一 - 999999998.99999988079071044921875
或{{1 (假设IEEE-754 999999999
格式),以实现定义的方式选择。默认情况下,大多数系统将舍入到最近,生成binary64
。
最终结果是,当您编写999999999
时,在这些系统上,最终会产生与编写999999998.9999999994
完全相同的效果。因此,后续转换产生999999999.0
- 从浮点数到整数的转换总是截断,但是没有什么可以截断。
使用999999999
,最接近的可表示数字为999999998.9999994994
和999999998.999999523162841796875
。截断后,任何一个都会生成999999998.99999940395355224609375
。同样,对于999999998
,最接近的可表示数字为8.9999999994
和8.999999999399999950355777400545775890350341796875
,其中任何一个都会在截断后生成8.9999999994000017267126168007962405681610107421875
。
答案 1 :(得分:4)
long long d = 999999998.9999999994;
999999998.9999999994
可以表示的double
最接近的值是999999999.0
- 请记住,浮点的精度有限;)。
因此,截断小数位会产生999999999
,这就是d
中保存的内容。
使用带有L
- 后缀的文字确实导致999999998
d
保存long double
具有更高的精确度。
long long d = 999999998.9999994994;
999999998.9999994994
可以代表double
的最接近值实际上低于999999999
- 我机器上的999999998.999999523
。随后截断小数位会产生999999998
,并存储在d
。