使用设置精度时如何阻止数字向上舍入?
How to stop the number from rounding up when using setprecision?
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来获取分数部分。
相关文章:
- C++将浮点指针值舍入为小数位数
- Boost::posix_time::ptime舍入到给定的分钟数
- 浮点定向舍入和优化
- 为什么输出精度没有正确舍入?
- 使用设置精度时如何阻止数字向上舍入?
- 输入验证将数字放入向量中
- 如何在使用 MPFR 时在提升多精度中设置舍入模式
- OpenCV 细分一致的 Rect2f 到 Rect2i 舍入
- 在特征中将低于特定阈值的数字舍入为零
- istringstream对长数字进行舍入-如何防止这种情况发生
- 如何将数字向上舍入到下一个整数
- C++和往返数字中的舍入
- C++舍入数字,不带上限或下限
- C++数字未正确舍入
- 使用 4/5 舍入规则对数字进行舍入
- 当数字变小的时候,long会加倍舍入吗
- 误差C++舍入数字 - 表达式必须具有整数或枚举类型
- 用两个小数求3个数字的平均值(不舍入!)
- 在c++中,如何使用iostream和iomanip在不显示数字的情况下进行舍入?
- 将任意长度的浮点值舍入为n位数字