浮点数输出异常:为何std::fixed输出1000000007而非1000000000?
问题解答
代码示例
#include <iostream> #include <ios> int main() { auto mod = 1e9+7; std::cout << mod << '\n'; std::cout << std::fixed << mod << '\n'; }
运行输出
1e+009 1000000007.000000
问题解析
为什么默认输出是
1e+009?
C++的std::cout默认会在数字绝对值≥1e6或≤1e-4时自动切换到科学计数法格式,同时默认输出精度为6位有效数字。1000000007保留6位有效数字后就是1.00000e+09,最终显示为1e+009。为什么
std::fixed后输出是1000000007.000000而非1000000000.000000?1e9是double类型字面量,1e9+7的结果1000000007属于可以被double精确存储的整数——double拥有53位二进制有效精度,能精确表示所有≤253的整数,而`1000000007`远小于230(约10.7亿),完全在精确存储范围内。变量mod实际存储的就是精确的1000000007.0,用std::fixed格式输出时会显示小数点后6位,自然就是1000000007.000000,不存在精度丢失的情况。
内容的提问来源于stack exchange,提问作者Lunatica
相关产品推荐
相关产品推荐

