首页 > 解决方案 > std::cout 不打印浮点数作为例外

问题描述

为什么std::cout << 1.00000001;打印1到控制台?它可以正常工作1.0001,只有在超过一定精度后才能正确停止打印。

这些数字是硬编码的,所以这个问题不是重复的。在那个问题中,由于添加了两个浮点数,所以产生了一个无理数,这意味着这些数字无法正确存储,但在我的情况下,这些数字是硬编码的,所以无法打印的原因是什么(或存储可能)一个浮点数显式初始化为1.00000001?。它只是cout未能打印价值还是真的是int

考虑以下程序

int main()
{
    float num = 1.0000001f;
    float num2 = num * 2;
    std::cout << num;
    std::cout << num2;
}

num2打印2但编译器没有给出关于从转换floatintin的警告line 2,所以我认为那num一定是一个float. 这是否意味着它只是一个问题cout?我可以安全地假设内部num实际上是 1.0000001f即使它打印1到控制台吗?

我的编译器是 Visual Studio 2019 的内置编译器。

标签: c++

解决方案


总结我的评论:

  • 数字 1.0000001 不能用浮点数表示。
  • 编译器将选择一个浮点值。
  • 它可以随心所欲地四舍五入(向上、向下或最接近),这是实现定义的。

所以如果你玩一下这个转换器,你可以看到在 1 之后,下一个浮点值是:

  • 1
  • 1.00000011920928955078125
  • 1.0000002384185791015625
  • 1.00000035762786865234375
  • 1.000000476837158203125
  • ...

1.0000001 介于前两者之间,因此您的编译器可以选择其中任何一个。在您的情况下,您的编译器似乎选择了 1。

(同样对于打印操作, cout 操作将在定义的精度后截断数字,因此它不会显示我在上面输入的完整数字 - 该精度默认为 6 位)。


推荐阅读