- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我总是发现iomanip令人困惑并且反直观。我需要帮助。
快速的互联网搜索发现(https://www.vedantu.com/maths/precision)“因此,我们将精度视为十进制数字中小数点之后的最大有效位数”(重点是我的)。这也符合我的理解。但是我编写了一个测试程序,并且:
stm << std::setprecision(3) << 5.12345678;
std::cout << "5.12345678: " << stm.str() << std::endl;
stm.str("");
stm << std::setprecision(3) << 25.12345678;
std::cout << "25.12345678: " << stm.str() << std::endl;
stm.str("");
stm << std::setprecision(3) << 5.1;
std::cout << "5.1: " << stm.str() << std::endl;
stm.str("");
输出:5.12345678: 5.12
25.12345678: 25.1
5.1: 5.1
如果精度为3,则输出应为:5.12345678: 5.123
25.12345678: 25.123
5.1: 5.1
显然,与浮点数有关,C++标准对“精度”的含义有不同的解释。stm.setf(std::ios::fixed, std::ios::floatfield);
那么前两个值的格式正确,但最后一个为5.100
。最佳答案
您可以尝试使用以下解决方法:
decltype(std::setprecision(1)) setp(double number, int p) {
int e = static_cast<int>(std::abs(number));
e = e != 0? static_cast<int>(std::log10(e)) + 1 + p : p;
while(number != 0.0 && static_cast<int>(number*=10) == 0 && e > 1)
e--; // for numbers like 0.001: those zeros are not treated as digits by setprecision.
return std::setprecision(e);
}
然后:
auto v = 5.12345678;
stm << setp(v, 3) << v;
struct __setp {
double number;
bool fixed = false;
int prec;
};
std::ostream& operator<<(std::ostream& os, const __setp& obj)
{
if(obj.fixed)
os << std::fixed;
else os << std::defaultfloat;
os.precision(obj.prec);
os << obj.number; // comment this if you do not want to print immediately the number
return os;
}
__setp setp(double number, int p) {
__setp setter;
setter.number = number;
int e = static_cast<int>(std::abs(number));
e = e != 0? static_cast<int>(std::log10(e)) + 1 + p : p;
while(number != 0.0 && static_cast<int>(number*=10) == 0)
e--; // for numbers like 0.001: those zeros are not treated as digits by setprecision.
if(e <= 0) {
setter.fixed = true;
setter.prec = 1;
} else
setter.prec = e;
return setter;
}
像这样使用它:
auto v = 5.12345678;
stm << setp(v, 3);
关于c++ - std::setprecision设置有效数字的数量。如何使用iomanip设置精度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66690841/
在 C++ 中,例如,当您编写 setprecision(12) 时,12 是以 10 为基数的,但是当您将其编写为 setprecision(012) 时,它是一个八进制数,为什么? 最佳答案 因为
我有以下功能片段: bool A_AbstractTester_Actor::Equals( int lineNumber, T_String valueText, double value, T_S
嗨,虽然我做了这样的事情 #include ... std::cout<<"Numbers "<
这是我的大部分代码,我需要将最后一个 cout 的精度设置为 2,这样我就可以得到小数点后的位置: #include #include #include #include using name
我正在做一个程序,首先从用户那里获取 2 个数字(具有 float 数据类型),然后询问用户他想要将数字除以什么数字,最后将它除以那个数字和' cout #include #include usi
我认为 setprecision 不会改变变量本身的值。此外,当您将 setprecision 附加到 cout 时,它只会坚持一次。但是,当我运行代码进行验证时,它不起作用。 考虑以下代码片段: i
以下代码: double x = 3.14; double y = 3.14159265359; cout<
我正在学习 C++,但我不断收到一个奇怪的错误。 setprecision 在一个答案中给了我多个小数点。 为什么输出有多个小数点? 程序 #include #include #include usi
这个问题在这里已经有了答案: Correct use of std::cout.precision() - not printing trailing zeros (3 个答案) 关闭 6 年前。
我似乎遇到了 C++ 编码问题。它涉及数学运算,我似乎让我的所有输出都正确,除了最后一个。除此之外,我的答案的小数点格式似乎不正确。答案应该包含两位小数,但我的四个小数点答案中只有两个似乎有两位小数。
我有一个文本文件,其中每一行都包含一些值,例如: xxx.xxxxxx 我正在读取每一行并使用 strod() 将它们转换为 str 并将它们存储在一个临时 double 变量中。 当我打印那个 do
堆栈溢出和 C++ 新手 std::cout << std::fixed << "Starting Balance: $" << std::setprecision(2) << startbal <<
我正在构建一个计算器应用程序,用于计算准确的税后净工资。我遇到的问题是程序会自动将值四舍五入。 我试过使用 setprecision,但它似乎只在 cout 或 cin 行中使用时才有效。这将需要用户
double value = 02369.000133699;//acutally stored as 2369.000133698999900 const std::uint32_t left =
据我所知,setprecision 函数指定了最小精度,但是当我运行以下代码时,我只得到小数点后的 3 个数字: int main() { double a = 123.4567890;
当流到标准输出时,我可以指定 setprecision 来舍入 double 值吗? ofile , 设置舍入方向: #include #include #include #include
当我编译下面的代码时,编译器给我警告: "Implicit conversion loses integer precision: 'std::streamsize' (aka 'long') to
当我编译下面的代码时,编译器给我警告: "Implicit conversion loses integer precision: 'std::streamsize' (aka 'long') to
我正在尝试以格式化文本进行一些简单的输出。 Setprecision 没有将我的变量打印到小数点后两位。 例如,如果 firstItemPrice = 2.20,则输出为 2.2 而不是 2.20 #
为什么有 BigDecimal.setScale() 方法将小数设置为某个值,而没有 MathContext.setScale() 方法,只有构造函数 MathContext (精度) 或其他方式解决
我是一名优秀的程序员,十分优秀!