14

有没有办法将浮点数舍入到 2 点?例如:3576.7675745342556变成3576.76.

4

9 回答 9

18
round(x * 100) / 100.0

如果你必须保持浮动:

roundf(x * 100) / 100.0

使用标准库函数的灵活版本:

double GetFloatPrecision(double value, double precision)
{
    return (floor((value * pow(10, precision) + 0.5)) / pow(10, precision)); 
}
于 2010-08-01T21:29:59.727 回答
14

如果您将其打印出来,请改用您可用的任何打印格式功能。

在 C++ 中

cout << setprecision(2) << f; 

要舍入以呈现到 GUI,请使用 std::ostringstream

于 2010-08-01T21:54:27.403 回答
3

乘以 100,四舍五入到整数(无论如何),除以 100。请注意,由于 1/100 不能用浮点数精确表示,请考虑保留固定精度整数。

于 2010-08-01T21:30:55.450 回答
3

对于那些像我一样在谷歌上搜索将浮点数格式化为货币的人:

#include <iomanip>
#include <sstream>
#include <string>

std::string money_format (float val)
{
    std::ostringstream oss;

    oss << std::fixed << std::setfill ('0') << std::setprecision (2) << val;

    return oss.str();
}
// 12.3456 --> "12.35"
// 1.2 --> "1.20"

您必须将其作为字符串返回。将其放回浮点数将失去精度。

于 2015-07-30T19:05:59.420 回答
2

不要使用浮点数。如果要打印美元,请使用整数存储美分数并在最后 2 位之前打印小数点。浮点数对于金钱来说几乎总是错误的,除非你在做简单的计算(比如简单的经济数学模型),其中只有数字的大小才是真正重要的,而且你从不减去附近的数字。

于 2010-08-02T05:41:44.383 回答
1

尝试使用

std::cout<<std::setprecision(2)<<std::cout<<x;

应该可以工作,并且浮点数出现后只有 2 位数字。

于 2015-07-24T15:12:54.313 回答
1

我没有找到一个让我满意的干净答案,因为大多数干净的答案都假设您需要打印结果,如果您只是将一些数据存储到可接受的分辨率,情况可能并非如此:

#include <sstream>

template<typename T>
T toPrecision(T input, unsigned precision)
{
    static std::stringstream ss;

    T output;
    ss << std::fixed;
    ss.precision(precision);
    ss << input;
    ss >> output;
    ss.clear();

    return output;
}

template<unsigned P, typename T>
T toPrecision(T input) { return toPrecision(input, P); }

// compile-time version
double newValue = toPrecision<2>(5.9832346739); // newValue: 5.98
// run-time version
double newValue = toPrecision(3.1415, 2); // newValue: 3.14

您还可以为Tand添加静态检查precision(在编译时签名的情况下)。

于 2021-01-06T02:35:18.037 回答
0

限制精度:
如果 x 是浮点数,则不四舍五入:(
上移 2 个小数位,去掉小数,下移 2 个小数位)

((int)(x*100.0)) / 100.0F

带舍入的浮点数:

((int)(x*100.0 + 0.5F)) / 100.0F

双无舍入:

((long int)(x*100.0)) / 100.0

双圆角:

((long int)(x*100.0 + 0.5)) / 100.0

注意:因为 x 是 afloat或 a double,所以小数部分将始终存在。这是 # 的表示方式 ( IEEE 754 ) 和 # 的精度之间的区别。
C99 支持round()

于 2013-08-06T16:22:42.723 回答
0

试试这个,效果很好

float=3576.7675745342556;
printf("%.2f",float);

更改其中的一些对象以查看和学习代码。

于 2017-10-15T04:43:13.620 回答