news 2026/4/29 10:34:18

浅谈浮点型与整型使用时的核心注意事项和技巧(T_T)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
浅谈浮点型与整型使用时的核心注意事项和技巧(T_T)

一、类型转换陷阱

1. 隐式转换

int a = 5; int b = 2; double c = a / b; // ❌ 结果是 2.0,不是 2.5!(整数除法) double d = a / 2.0; // ✅ 结果是 2.5(自动提升为 double) double e = double(a) / b; // ✅ 显式转换,结果 2.5

规则:运算时先统一类型,再计算。

2. 混合运算的优先级

int a = 1e9; // 1000000000 long long b = 1e9 * 1e9; // ❌ 溢出!先算 int*int,结果还是 int long long c = 1LL * 1e9 * 1e9; // ✅ 1LL 强制提升为 long long

技巧:在表达式开头加1LL1.0等强制提升类型。


二、浮点数精度问题

1. 不要直接用==比较

double a = 0.1 + 0.2; double b = 0.3; if (a == b) cout << "相等"; // ❌ 可能不相等!(二进制精度误差) // ✅ 正确做法:比较误差范围 const double EPS = 1e-9; if (fabs(a - b) < EPS) cout << "相等";

2. 大数吃小数

double big = 1e20; double small = 1.0; double result = big + small - big; // ❌ 结果是 0,small 被"吃掉"了

3. 累积误差

// ❌ 累加很多小数会产生误差 double sum = 0; for (int i = 0; i < 10000; i++) sum += 0.0001; // sum 可能不是 1.0 // ✅ Kahan 求和算法(高精度) double sum = 0, c = 0; // c 是补偿值 for (int i = 0; i < 10000; i++) { double y = 0.0001 - c; double t = sum + y; c = (t - sum) - y; sum = t; }

三、输入输出技巧

1. 去除浮点数末尾无意义的 0

double x = 2.50000; cout << fixed << setprecision(10) << x << endl; // 2.5000000000(丑) // ✅ 方法:用字符串处理或 boost,或简单判断 cout << setprecision(10); if (x == floor(x)) cout << (long long)x; // 整数部分 else cout << x;

2. 快速 IO 与浮点精度冲突

ios::sync_with_stdio(0); cin.tie(0); // 开启后,printf/scanf 和 cin/cout 混用可能出问题 // 浮点输出建议统一用一种

3. 科学计数法控制

double x = 123456789.0; cout << scientific << x << endl; // 1.234568e+08 cout << fixed << x << endl; // 123456789.000000 cout << defaultfloat << x << endl; // 123456789(自动选择)

四、竞赛/算法中的实用技巧

1. 整数二分 vs 浮点二分

// 整数二分(找边界) while (l < r) { int mid = (l + r) >> 1; if (check(mid)) r = mid; else l = mid + 1; } // 浮点二分(固定次数,避免死循环) for (int i = 0; i < 100; i++) { // 跑 100 次足够精度 double mid = (l + r) / 2; if (check(mid)) r = mid; else l = mid; }

2. 输出指定位数(四舍五入)

double x = 3.14159; cout << round(x * 100) / 100; // 保留 2 位小数,输出 3.14 // 或 cout << fixed << setprecision(2) << x; // 3.14

3. 防止pow的精度爆炸

// ❌ pow 可能不精确 double x = pow(2, 10); // 1024,但可能是 1023.9999999 // ✅ 整数幂用快速幂,或自己乘 long long p = 1; for (int i = 0; i < 10; i++) p *= 2; // 精确的 1024

五、结语:

希望本章能够帮助到您~,码字不易,感谢您的点赞收藏o(* ̄▽ ̄*)ブ

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/18 21:25:21

企业级智能客服DSL文件:AI辅助开发的架构设计与性能优化

最近在做一个企业级智能客服系统的重构项目&#xff0c;深刻体会到了传统开发方式的“痛”。今天就来聊聊我们是如何通过引入DSL&#xff08;领域特定语言&#xff09;&#xff0c;并结合AI辅助开发&#xff0c;来大幅提升开发效率和系统可维护性的。这不仅仅是一个技术选型&am…

作者头像 李华
网站建设 2026/4/19 1:00:41

AI智能问答客服系统实战:从架构设计到生产环境部署

最近在做一个企业级的AI智能问答客服项目&#xff0c;从零到一搞下来&#xff0c;踩了不少坑&#xff0c;也积累了一些实战经验。今天就来聊聊&#xff0c;怎么把一个听起来很“AI”的客服系统&#xff0c;实实在在地做出来并部署上线。这不仅仅是调个API那么简单&#xff0c;涉…

作者头像 李华
网站建设 2026/4/18 21:29:08

Chin Bull Bot 开发实战:从零构建高可用的交易机器人

在加密货币交易领域&#xff0c;手动操作不仅效率低下&#xff0c;还容易受到情绪影响。许多开发者尝试构建自动化交易机器人&#xff0c;却常常在交易所API差异、数据流处理、策略回测和系统稳定性等环节遇到挑战。今天&#xff0c;我们就以构建一个名为“Chin Bull Bot”的高…

作者头像 李华
网站建设 2026/4/19 0:37:39

Cocos Creator 集成 WebRTC 实战:从零搭建实时音视频通信

最近在做一个游戏社交功能&#xff0c;需要集成实时语音聊天。作为 Cocos Creator 的开发者&#xff0c;我自然希望能在游戏引擎内直接搞定&#xff0c;而不是额外引入一个庞大的 SDK。经过一番摸索&#xff0c;成功用原生 WebRTC 实现了这个功能&#xff0c;这里把从零搭建的过…

作者头像 李华
网站建设 2026/4/19 0:37:38

Zustand 切片模式深度解析

# Zustand 切片模式&#xff1a;构建清晰可维护的状态管理 在构建现代前端应用时&#xff0c;状态管理是一个核心挑战。随着应用规模的增长&#xff0c;状态逻辑往往变得复杂而难以维护。Zustand作为轻量级的状态管理库&#xff0c;提供了一种优雅的解决方案——切片模式&#…

作者头像 李华