【问题标题】:How do I determine the number of places following a decimal in a floating point value?如何确定浮点值中小数点后的位数?
【发布时间】:2011-01-18 22:30:48
【问题描述】:

在 C++ 中,您可以使用 std::numeric_limits::digits10 来准确找出在小数位之前可以获得多少位精度。如果我知道这个数字总是在 0 和 1 之间(含 0 和 1),我如何找出我可以得到多少小数位?

编辑:我问的原因是我有一个外部 RNG 生成双打并使用标准输入和输出将它们通过管道传递到第二个程序,所以如果随机生成的数字没有正确输出到标准输出,第二个程序无法通过标准输入获取它们的完整值,因为它们被第一个程序的输出截断,然后被第二个程序舍入为可表示的值。我想完整地在程序之间传递值。 谢谢

【问题讨论】:

  • 编辑:部分实际上是一个不同的问题,而且还不错。我建议您单独发布它(以供将来参考)。建议标题:我需要多少个十进制数字才能唯一地表示每个双精度数?
  • 我已经想指出,0.0000000000000000000000000001(截断)是介于 0 和 1 之间的有效双精度。事实上,对于 IEEE754,最小的双精度约为 2E-308。这是一长串零。
  • 我明白了。那么我最好的选择是管道二进制表示,或者(我 99% 确定我知道这部分的答案)我是否可以使用科学记数法(使用 E)读取数字而不丢失任何数字细节?

标签: c++ floating-point decimal


【解决方案1】:

std::numeric_limits<FloatingPointType>::digits10 是类型可以精确表示的十进制数字的总数个数。如果你写一个数字为 1234.56 或 1.23456 ⋅ 103 或 123456 ⋅ 10-2 与确切位数无关,因此之前没有区别和小数点后。

【讨论】:

    【解决方案2】:

    您可以拥有的最大有效位数由std::numeric_limits<...>::digits 给出。对于 IEEE 浮点数和双精度数,这通常分别为 24 和 53。

    【讨论】:

      【解决方案3】:

      C++ 标准不保证任何事情。 如果您必须严格控制小数点后的位数,则必须编写自己的代码来执行此操作(例如固定格式输出)。 最终,这取决于您使用的编译器。 如果您需要控制小数位数,则使用 C 和 printf 的格式控制会获得更好的运气。

      【讨论】:

        【解决方案4】:

        如果您总是需要一定数量的数字,建议您考虑 boost。例如format library,或数字conversion library。如果您还没有,您还应该阅读 Goldberg article 关于浮点数的文章

        【讨论】:

          【解决方案5】:

          您可以使用setprecision(n);,其中n 是小数点后的位数。 例如,如果我想要输出 15 位小数:

          cout<< setprecision(15);
          

          注意:不要忘记包含头文件才能使用此功能:

          #include<iomanip>
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-11-18
            • 1970-01-01
            • 2020-04-15
            • 2012-05-22
            • 2021-04-23
            • 2012-11-11
            • 2013-08-14
            相关资源
            最近更新 更多