我想将楼层号截断为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>
,但它不存在。
答案 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::floor
或std::round
代替myFloor
或myRound
。 (请注意,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;
}
请注意,通过比较舍入数字和我建议的函数获得的结果并不等同!