将地板截断为三位小数C ++

时间:2013-12-15 12:30:48

标签: c++ decimal truncate

我想将楼层号截断为3位十进制数。例如:

input : x = 0.363954;
output: 0.364

我用过

double myCeil(float v, int p)
{
  return int(v * pow(float(10),p))/pow(float(10),p );
}

但输出为0.3630001。 我尝试使用trunc中的<cmath>,但它不存在。

3 个答案:

答案 0 :(得分:1)

浮点数学通常使用二进制表示;因此,有十进制值无法准确表示为浮点值。试图摆弄内部精确问题就是这个问题。但是,当有人试图这样做时,他们真的试图使用特定的精度显示一个值,这很简单:

double x = 0.363954;
std::cout.precision(3);
std::cout << x << '\n';

答案 1 :(得分:0)

您要查找的功能是std::ceil,而不是std::trunc

    double myCeil(double v, int p)
    {
        return std::ceil(v * std::pow(10, p)) / std::pow(10, p);
    }

代替std::floorstd::round代替myFloormyRound。 (请注意,std::round出现在C ++ 11中,如果尚未启用,则必须启用它。

答案 2 :(得分:0)

完全不可能获得0.364。没有办法可以将数字0.364(364/1000)完全存储为浮点数,就像你需要无限小数位来将1/3写成0.3333333333 ...

你做得正确,除了你可能想用std :: round()来舍入到最接近的数字,而不是截断的int()。

比较浮点数是一项棘手的业务。通常,您可以做的最好的事情是检查数字是否足够接近。

您是否正在进行舍入以进行比较?在这种情况下,看起来你很满意3位小数(这取决于每个问题......),在这种情况下,为什么不只是

bool are_equal_to_three_decimals(double a, double b)
{
   return std::abs(a-b) < 0.001;
}

请注意,通过比较舍入数字和我建议的函数获得的结果并不等同!