【问题标题】:How to stop the number from rounding up when using setprecision?使用setprecision时如何阻止数字四舍五入?
【发布时间】:2020-06-26 23:59:33
【问题描述】:
const double MIN_STD_POWER = 90.111;
const double MAX_STD_POWER = 99.999;
double m_size = 2;

void display() const
{
    if (m_size == MAX_STD_POWER || m_size == MIN_STD_POWER)
    {
        cout << m_size << " liters - " << m_type << endl;
    }
    else
    {
        cout << std::fixed << std::setprecision(2) << m_size << " liters - " << m_type << endl;
    }
}

所以基本上,我试图将m_size 打印到两位有效数字,但不是MAX_STD_POWER,因为它一直四舍五入为100.00,而不是99.999为什么上述方法不起作用?

我想要的输出示例:

4.10 - liters 
2.10 - liters 
2.10 - liters 
2.10 - liters 
Ship doesn't exceed power regulation of: 99.999

我得到的输出示例:

4.10 - liters 
2.10 - liters 
2.10 - liters 
2.10 - liters 
Ship doesn't exceed power regulation of: 100.00

【问题讨论】:

  • 示例输出与代码不匹配,在代码中liters 后面总是有一个连字符。您还说它打印的是 100.00 而不是 99.999,但随后在示例输出中显示为 99.999。发布您获得的确切输出并解释它是如何不期望的会改善问题
  • 请制作可以在本地直接复制和编译的示例。当前的不产生显示的输出。
  • 您知道比较相等的两个浮点数的风险吗? wandbox.org/permlink/Eg2LcS8EkUEnv7bG

标签: c++ floating-point rounding


【解决方案1】:

需要三位时将其四舍五入为小数点后三位,需要两位时将其四舍五入为两位 (live demo)。

void display() const
{
    const int precision = (m_size == MAX_STD_POWER || m_size == MIN_STD_POWER) ? 3 : 2;
    cout << std::fixed << std::setprecision(precision) << m_size << " liters - " << m_type << endl;
}

【讨论】:

  • 我试过了,但它总是打印出右侧
  • 我添加了一个现场演示的链接。尝试一下。它应该告诉你,它有效。如果你还有问题,那就问吧。我不知道,顺便说一下,“右侧”是什么意思。
【解决方案2】:

浮点数在打印时会四舍五入(到最接近的)。

部分问题在于这些数字:

90.111
99.999

可能无法以浮点数精确表示。它可能非常接近但不准确。当我以很高的精度打印出来时,我得到:

99.998999999999995
90.111000000000004

2 significant digits:
1e+02
 90

3 significant digits:
100
 90.1

5 significant digits:
 99.999
 90.111

“向下舍入”的最简单方法是截断为整数。

int printable = m_size * 100; // 100 2 significant digits.
std::cout << (printable / 100) << "." << (printable % 100) << "\n"

但是在这种情况下你可以使用双打。

std::cout << std::setprecision(5) << m_size << "\n";

简单的经验法则:仅在您真正需要时才使用浮点(值的范围是连续的而不是离散的)。如果您正在存储具有某种程度的进动(即最接近的千分之一)存储在一个整数中,但乘以 1000,以便您准确存储该值。只需要在打印的时候进行转换,然后用除法得到整数部分,用mod得到小数部分。

【讨论】:

  • 我不太明白这个,如果我截断 m_size 一切都会受到影响。
猜你喜欢
  • 1970-01-01
  • 2023-01-12
  • 1970-01-01
  • 2015-11-12
  • 1970-01-01
  • 1970-01-01
  • 2022-11-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多