修复 c++ 中 static_cast() 的精度

发布于 2024-12-09 09:25:30 字数 251 浏览 1 评论 0原文

# include <iostream>
using namespace std;

int main()
{
    double a;
    cin >> a;
    int b = (int) a*100;
    cout << b << endl;
}

如果你输入 2.53,它会给出 b=252

我知道这是一个精度问题,但是如何在不使用比较的情况下修复它?

# include <iostream>
using namespace std;

int main()
{
    double a;
    cin >> a;
    int b = (int) a*100;
    cout << b << endl;
}

If you input 2.53, it gives b=252

I know it's a precision thing, but how do you fix it without using comparison?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

燃情 2024-12-16 09:25:30

如果保证 a 为正数,则使用:

int b = (int) (a*100+0.5);

如果不使用:

int b = (int) floor(a*100+0.5);

Float 到 int 强制转换截断(向零舍入)。

如果您想继续截断,但只想避免精度问题,请使用小 epsilon (1e-4) 而不是上面代码中的 0.5 int。

If a is guaranteed to be positive, use:

int b = (int) (a*100+0.5);

If not use:

int b = (int) floor(a*100+0.5);

Float to int cast truncates (rounds towards zero).

If you want to keep truncating, but only want to avoid precision issues, use a small epsilon (1e-4) instead of 0.5 int the code above.

请持续率性 2024-12-16 09:25:30

您想要舍入而不是截断。地板功能对此很方便:

int b = (int)floor(a*100+0.5);

You want to round instead of truncating. The floor function is handy for this:

int b = (int)floor(a*100+0.5);
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文