丢弃4个精度点?

时间:2013-02-04 12:52:13

标签: c++ floating-point floating-point-precision

我有一个浮点数,但我只希望数字达到2点精度。我如何在C ++中得到它?

float foo(float num) { // num=1234.567891
    // code
    return num2;           // returns 1234.560000
}

3 个答案:

答案 0 :(得分:1)

一种简单的方法是:

float foo(float num) {
    return floor(num * 100) / 100;
}

您也可以考虑:

float foo(float num) {
    return (int)(num * 100) / 100.0f;
}

负数可能存在差异。只有我可以从您的问题中获得的信息是,对于正数,您需要floor(而不是round)。

答案 1 :(得分:0)

您可以通过乘以舍入/截断来尝试将浮点数舍入到一定数量的小数位。

所以num = floor(num * 100.f) / 100.f;会尝试截断到两位小数。

但请注意,这与修复浮点数的精度不同。根据定义,浮点数中的小数点浮动。而你只有大约7位精度。

所以你的原始数字不能像“1234.567891”那样精确 - 这对浮动来说太精确了。

也许更重要的是,这种功能的输出可能也不准确。 “1234.56”无法用float精确表示,因此返回的值不会是“1234.560000”。

数字的整数部分越大,小数点后面的数字越少。实际上,即使是中等数量也不能代表任何小数部分。

答案 2 :(得分:0)

浮点类型有自己的内部精度。你无法改变它。您可以通过各种方式调整值,但最终浮点类型可以管理自己的精度,并且您无法成功限制它们的作用。即使您设法将一堆零强制转换为某些值的低位,后续计算仍将使用完整精度,并且您只在计算中引入了一些随机噪声。

可以做的是控制输入输出上的有效位数。而这几乎总是管理精确度的正确方法。