限制浮点精度?

时间:2010-08-01 21:29:10

标签: c++ c algorithm floating-point floating-point-conversion

有没有办法将浮点数舍入为2分?例如:3576.7675745342556变为3576.76

10 个答案:

答案 0 :(得分:14)

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)); 
}

答案 1 :(得分:13)

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

在c ++中

cout << setprecision(2) << f; 

要舍入渲染到GUI,请使用std :: ostringstream

答案 2 :(得分:3)

乘以100,舍入为整数(无论如何),除以100.注意,由于1/100不能在浮点中精确表示,因此请考虑保持固定精度的整数。

答案 3 :(得分:2)

不要使用花车。如果要打印美元,请使用存储分数的整数并在最后2个位置之前打印小数点。除非你进行简单的计算(比如天真的经济数学模型),其中只有数字的大小真正重要且你永远不会减去附近的数字,所以浮点数几乎总是错误的。

答案 4 :(得分:2)

对于那些谷歌搜索格式化浮动到我的钱的人:

#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"

您必须将其作为字符串返回。将它放回浮子会失去精度。

答案 5 :(得分: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

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

答案 6 :(得分:0)

限制精度:
如果x是浮点数,则不进行舍入:
(向上移动2位小数,去掉分数,向下移动2位小数)

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

漂浮与四舍五入:

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

双w / o舍入:

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

双w /舍入:

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

注意:由于x是floatdouble,因此小数部分将始终存在。 #是如何表示(IEEE 754)和#的精确度之间的区别 C99支持round()

答案 7 :(得分:0)

尝试使用

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

应该有效,浮点出现后只有2位数。

答案 8 :(得分:0)

试试这个,它完美无缺

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

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

答案 9 :(得分:-6)

yourFloatNumber= Float.Round(yourFloatNumber,2); // In C#