C加倍到长

如果我用c写代码
long long d = 999999998.9999999994;
cout<<d;

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

但是这段代码输出

long long d = 999999998.9999994994;
cout<<d;

是999999998(四舍五入)

这与精度有关吗?有什么方法可以改变精度. floor()函数也提供相同的输出.

我还注意到,如果我将值8.9999994994或8.9999999994分配给d(上面的变量).输出为8.

解决方法

999999998.9999999994不能精确表示为double,因此实际值是999999998.9999999994两侧的两个可表示数字之一 – 999999998.99999988079071044921875或999999999(假设IEEE-754 binary64格式),以实现定义的方式选择.大多数系统认舍入到最近,产生999999999.

最终结果是,当您编写999999998.9999999994时,在这些系统上,它最终具有与写入999999999.0完全相同的效果.因此,后续转换产生999999999 – 从浮点数到整数的转换总是截断,但是这里没有什么可以截断.

与999999998.9999994994,最接近的可表示数字是999999998.999999523162841796875和999999998.99999940395355224609375.截断后生成999999998.类似地,对于8.9999999994,最接近的可表示数字是8.999999999399999950355777400545775890350341796875和8.9999999994000017267126168007962405681610107421875,并且任何一个在截断后将产生8.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...