C++ 将楼层截断为三个小数点C++;

C++ 将楼层截断为三个小数点C++;,c++,decimal,truncate,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,但它不存在。您要查找的函数是std::ceil,而不是std::trunc double myCeil(double v, int p)

我想将楼层号截断为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
,但它不存在。

您要查找的函数是
std::ceil
,而不是
std::trunc

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

根据需要在
std::floor
std::round
中替换
myFloor
myRound
。(请注意,
std::round
出现在C++11中,如果尚未启用,则必须启用它)。

浮点数学通常使用二进制表示;因此,存在无法准确表示为浮点值的十进制值。试图摆弄内部精度正是这个问题的症结所在。但大多数情况下,当有人试图这样做时,他们实际上是想用特定的精度显示一个值,这很简单:

double x = 0.363954;
std::cout.precision(3);
std::cout << x << '\n';
double x=0.363954;
标准:计算精度(3);

std::cout精确得到0.364是不可能的。你无法将数字0.364(364/1000)准确地存储为浮点数,就像你需要无穷多的小数才能将1/3写为0.3333一样

您的操作是正确的,只是您可能希望使用std::round()将整数舍入到最接近的数字,而不是int(),后者会截断

比较浮点数是一件棘手的事情。通常,您所能做的最好的事情是检查这些数字是否彼此足够接近

你是为了比较而四舍五入吗?在这种情况下,您似乎对3个小数感到满意(这取决于问题中的每个问题…),在这种情况下,为什么不

bool are_equal_to_three_decimals(double a, double b)
{
   return std::abs(a-b) < 0.001;
}
bool等于三位小数(双a,双b)
{
返回标准::abs(a-b)<0.001;
}

请注意,通过比较舍入数和我建议的函数得到的结果并不相等

您是否包含了
?您的平台是什么?应该包括std::floorI听说一些版本的visual C没有它。你在用MSVC吗?@Tim Yes我把它包括进去了。@Polkadtcadaver
std::floor
也不存在。使用
ceil
0.363954
转换为
0.36399999
@Misaki,这是因为
0.36399999
是最接近
0.364
的双精度值。好的,我仍然有同样的问题。@Misaki如果您希望使用完美的十进制算法,那么double就帮不了您。我不想显示它,我需要在比较过程中使用(,and==),所以它对0.00001的增量非常敏感。@Misaki-听起来像是XY问题。与其描述您正在考虑的技术,不如描述该技术应该解决的问题。通常有比摆弄精度更好的方法(主要是因为摆弄精度很棘手)。我正在比较图像中两个圆点的圆度。我通过这段代码计算圆度
float-GetCircularity(向量外壳,浮点区域,点质心){float-circularity=0;for(int i=0;i
@Misaki-这超出了我的专业范围,因此我无法提供任何详细的帮助。但是这个计算看起来好像已经做了很多次了,很有可能有人发布了一些有用的东西。