首页 > 解决方案 > 如何设置浮点数的精度?

问题描述

对于数字 a = 1.263839,我们可以做 - float a = 1.263839 cout << fixed << setprecision(2) << a <<endl; 输出: - 1.26

但是,如果我想设置一个数字的精度并存储它,例如 - 将 1.263839 转换为 1.26 而不打印它,该怎么办。

标签: c++

解决方案


但是如果我想设置一个数字的精度并存储它怎么办

您可以将所需的精度存储在变量中:

int precision = 2;

然后,您可以稍后在将浮点数转换为字符串时使用此存储的精度:

std::cout << std::setprecision(precision) << a;

我认为 OP 希望在不打印数字的情况下从 1.263839 转换为 1.26。

如果是您的目标,那么您首先必须意识到,1.26 不能用最常用的浮点表示法表示。最接近的 32 位二进制 IEEE-754 值是 1.2599999904632568359375。

因此,假设这样的表示,您可以期望的最好值是非常接近 1.26 的某个值。在最好的情况下,我展示了一个,但由于我们需要计算该值,请记住,除了无法精确表示该值之外,还可能涉及一些微小的错误(至少在理论上;您的示例输入使用没有错误下面的算法,但应始终使用浮点数学考虑精度损失的可能性)。

计算如下:

  • 让 P 赌您想要四舍五入的小数点后的位数(在这种情况下为 2)。
  • 令 D 为 10 P(在本例中为 100)。
  • 将输入乘以D
  • std::round到最接近的整数。
  • 除以D

PS 有时您可能不想四舍五入到最接近的值,而是想要精确到std::floor或。std::ceil这有点棘手。简直std::floor(val * D) / D是错误的。例如,9.70 下限为小数点后两位将变为 9.69,这是不可取的。

在这种情况下,您可以做的是乘以一个精度量级,四舍五入到最接近的值,然后除以额外的量级并继续:

  • 让 P 赌您想要四舍五入的小数点后的位数(在这种情况下为 2)。
  • 令 D 为 10 P(在本例中为 100)。
  • 将输入乘以D* 10
  • std::round到最接近的整数。
  • 除以 10
  • std::floor或者std::ceil
  • 除以D

推荐阅读