可能重复:
C++中float的round()
我有一个双(称为x),意味着55,但实际存储为54.999999999999943157,我刚才意识到.
所以,当我这样做
double x = 54.999999999999943157;
int y = (int) x;
Run Code Online (Sandbox Code Playgroud)
y = 54而不是55!
这困惑了我很久了.如何让它正确圆?
有一段时间,我发现自己舍入了一些数字,我总是要将结果转换为整数:
int rounded = (int) floor(value);
Run Code Online (Sandbox Code Playgroud)
为什么所有舍入函数(ceil(),floor())都返回一个浮点数,而不是一个整数?我发现这非常不直观,并且希望得到一些解释!
我是偏执狂,其中一个函数可能会给出一个不正确的结果:
std::floor(2000.0 / 1000.0) --> std::floor(1.999999999999) --> 1
or
std::ceil(18 / 3) --> std::ceil(6.000000000001) --> 7
Run Code Online (Sandbox Code Playgroud)
可以这样的事情发生吗?如果确实存在这样的风险,我打算使用以下功能以便安全地工作.但是,这真的有必要吗?
constexpr long double EPSILON = 1e-10;
intmax_t GuaranteedFloor(const long double & Number)
{
if (Number > 0)
{
return static_cast<intmax_t>(std::floor(Number) + EPSILON);
}
else
{
return static_cast<intmax_t>(std::floor(Number) - EPSILON);
}
}
intmax_t GuaranteedCeil(const long double & Number)
{
if (Number > 0)
{
return static_cast<intmax_t>(std::ceil(Number) + EPSILON);
}
else
{
return static_cast<intmax_t>(std::ceil(Number) - EPSILON);
}
}
Run Code Online (Sandbox Code Playgroud)
(注意:我假设给定的'long double'参数适合'intmax_t'返回类型.)
我正在 cppreference 中查看这些相关的标准函数系列:std::round、std::floor和。std::ceilstd::trunc
有什么理由为什么std::round是唯一一个提供特定签名long并long long作为返回类型的吗?我正在努力思考除了历史之外的任何原因,但std::round最近才在 C++11 中添加了这一点。
琐碎的问题:我只是想知道,如果一个人想要提高一个int或一个long来强制另一个int或long,
(long)std::pow((double)a,(double)b)
Run Code Online (Sandbox Code Playgroud)
足够,或者我需要
(long)(0.5 + std::pow((double)a,(double)b))
Run Code Online (Sandbox Code Playgroud)
?