将浮点数与字符串连接并舍入到小数点后 2 位

Posted

技术标签:

【中文标题】将浮点数与字符串连接并舍入到小数点后 2 位【英文标题】:Concatenate float with string and round to 2 decimal places 【发布时间】:2021-03-24 00:23:47 【问题描述】:

所以我在下面有一个格式化为多态 void display(string& outStr) 的函数。这个函数的输出基本上应该格式化成一个大字符串,保存到outStr参数中,然后返回给调用函数。

我已成功地将我的大字符串格式化为多行,但我想将我的浮点值四舍五入到小数点后 2 位,但我不知道我目前附加字符串的方式如何。我尝试使用 round() 和 ceil() 函数,正如一些在线帖子所建议的那样,但每个小数位后仍然出现 6 个零。我很感激这方面的一些帮助,因为我一直在寻找解决方案,但都没有奏效。

另外,我想知道我用来将浮点数转换为字符串的 to_string() 函数是否可以在 C++98 中正确编译和执行?我使用的是 C++11,但我的老师使用的是 C++98,我非常担心它最终无法编译。

如果没有,谁能建议我如何实现将浮点数转换为字符串的相同结果,同时仍将多行格式化为 outStr 字符串参数并将其返回给函数?我不允许更改函数的参数,它必须保持为 display(string& outStr)

我的输出更长更复杂,但我简化了示例以获得一个简短而简单的解决方案。

再次感谢您的帮助!

#include <iostream>
using namespace std;
#include <string>
#include <sstream>
#include <cmath>
#include "Math.h"

void Math::display(string& outStr)
    float numOne = 35;
    float numTwo = 33;
    
    string hello = "Hello, your percent is: \n";
    outStr.append(hello);
    string percent = "Percent: \n";
    outStr.append(percent);
    float numPercent = ceil(((numOne / numTwo) * 100) * 100.0) / 100.0;
    outStr.append(to_string(numPercent));
    outStr.append("\n");
        

输出应如下所示:

Hello, your percent is:
Number:
106.06%

【问题讨论】:

您可能正在寻找std::ostringstream。如std::ostringstream os; os &lt;&lt; "Percent: " &lt;&lt; std::fixed &lt;&lt; std::setprecision(2) &lt;&lt; numOne / numTwo * 100 &lt;&lt; '%'; outStr = os.str(); 有没有办法将该语句中的浮点数四舍五入到小数点后两位? std::setprecision(2) 就是这样做的。你试过了吗?它在哪些方面未能满足您的要求? 【参考方案1】:

无需进行任何疯狂的转换。由于该函数被称为显示,我的猜测是它实际上应该显示该值,而不是仅仅将其保存到一个字符串。

以下代码演示了如何通过格式化打印来完成。

#include <cstdio>
#include <iomanip>
#include <iostream>

int main() 
  double percentage = 83.1415926;
  std::cout << "Raw: " << percentage << "%\n";
  std::cout << "cout: " << std::fixed << std::setprecision(2) << percentage << "%\n";
  printf("printf: %.2f\%%\n", percentage);  // double up % to print the actual symbol

输出是:

Raw: 83.1416%
cout: 83.14%
printf: 83.14%

如果功能如您描述的那样倒退,则有两种可能性。您不了解实际需要什么,并且给了我们一个错误的解释(我的猜测是函数签名),或者分配本身就是纯粹的垃圾。尽管 SO 喜欢抨击教授,但我很难相信你所描述和写的正是教授想要的。没有意义。

几点说明:您展示的代码没有多态性。 to_string() 从 C++11 开始存在,通过查找函数 (Link) 很容易看到。您的代码尝试打印的内容与您的输出内容之间也存在差异,这甚至在我们进入数字格式部分之前。 “百分比”还是“数字”?

【讨论】:

以上是关于将浮点数与字符串连接并舍入到小数点后 2 位的主要内容,如果未能解决你的问题,请参考以下文章

将浮点数舍入到 N 个小数位

如何在不进行任何舍入的情况下将浮点数转换为小数点后 4 位?

如何将浮点数打印到 n 位小数,包括尾随 0?

如何舍入一个浮点数?

为啥 as_tibble() 将浮点数舍入到最接近的整数?

JS实现浮点数精确舍入小数点