pir*_*ate 6 c++ floating-point double floating-point-conversion
如果我用c ++编写代码:
long long d = 999999998.9999999994;
cout<<d;
Run Code Online (Sandbox Code Playgroud)
我得到输出:( 999999999四舍五入)
但是这段代码的输出:
long long d = 999999998.9999994994;
cout<<d;
Run Code Online (Sandbox Code Playgroud)
是999999998(四舍五入)
这与精度有关吗?有什么方法可以改变精度.floor()功能也提供相同的输出.
我还注意到,如果我分配值8.9999994994或8.9999999994到d(上述变量).输出是8.
T.C*_*.C. 10
999999998.9999999994并不完全可以表示double,因此实际值是两侧的两个可表示数字之一999999998.9999999994- 999999998.99999988079071044921875或者999999999(假设IEEE-754 binary64格式),以实现定义的方式选择.大多数系统将默认舍入到最近,生成999999999.
最终结果是,在您编写999999998.9999999994它们时,这些系统最终会产生与写入完全相同的效果999999999.0.因此,随后的转换产生999999999- 从浮点数到整数的转换总是截断,但是这里没有什么可以截断.
有999999998.9999994994,最接近的可表示数字是999999998.999999523162841796875和 999999998.99999940395355224609375.999999998截断后产生任一个.类似地,with 8.9999999994,最接近的可表示数字是8.999999999399999950355777400545775890350341796875和8.9999999994000017267126168007962405681610107421875,并且8在截断之后将产生任何一个.