C++科学记数法中的舍入问题

dfuffjeb  于 2023-01-28  发布在  其他
关注(0)|答案(1)|浏览(208)

我试着用科学记数法,但考虑到正确的规则是:A)对于以0、1、2、3、4结尾的所有十进制数,四舍五入必须为低数量级; B)对于以5、6、7、8、9结尾的所有十进制数,四舍五入必须为高数量级。
我执行了以下函数:

std::string MyClass::doubleToString(double num, int precision) {
    std::ostringstream ss;
    ss << std::scientific << std::setprecision(precision) << num;
    return ss.str();
}

例如,当我调用doubleToString(0.35, 0)时,它返回3E-1,而它应该返回4 E-1。我认为这是一个非常简单的问题,但我不明白为什么我没有得到正确的行为。

3htmauhk

3htmauhk1#

看来你是想凑一半。
在C++中,您可以尝试使用std::fesetround更改浮点舍入模式:

#include <iostream>
#include <iomanip>
#include <cfenv>

int main()
{
  std::cout << std::setprecision(0) << std::scientific;

  std::fesetround(FE_DOWNWARD);
  std::cout << "rounding down: " << 0.35 << "\n\n";         // --> 3e-01

  std::fesetround(FE_UPWARD);
  std::cout << "rounding up: " << 0.35 << '\n';             // --> 4e-01
}

例如,参见https://godbolt.org/z/WhGe89one
但是请注意,这不会产生您想要的输出。

  1. https://en.wikipedia.org/wiki/Rounding#Rounding_half_up

相关问题