使用设置精度时如何阻止数字向上舍入?

How to stop the number from rounding up when using setprecision?

本文关键字:数字 舍入 何阻止 设置 精度      更新时间:2023-10-16
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

当您需要三位时,将其四舍五入到三位小数,当您需要两位时,将其四舍五入为两位(现场演示(。

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;
}

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

部分问题在于这些数字:

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来获取分数部分。