XZ_iOS之关于double/float数据计算精度问题

1、我们的app有一个判断,当用户输入的值,小于等于剩余的余额时,给用户弹窗,代码不往下执行
当用户输入 0.01 时,po 一下的结果是:0.10000.... ,当用户的余额是0.01时,po一下网络请求的返回结果是:0.009999...

当用户输入 66.05时,po 一下的结果是:66.049999...,当用户的余额是66.05时,po一下网络请求的返回结果是:66.049999...
所以,当数据较大时,不会有影响,因为用户输入的数据和网络返回数据都被变成了不精确的小值了;但是,当数据较小时,用户输入的数据没有被转,网络返回的数据被转成了不精确的小值,导致用户输入永远大于网络返回的数据,代码无法往下执行;

解决:使
<think>嗯,用户让我详细解释他们的CMakeLists.txt文件,特别是用于构建LVGL项目的。我需要先通读他们提供的CMake配置,然后逐步解释每个部分的作用。首先,我应该从整体结构开始,分块解析每个指令和设置。 用户可能太熟悉CMake的语法,所以需要解释每个命令的功能。比如cmake_minimum_required是用来指定CMake的最低版本,这能确保兼容性。然后project(lvgl)定义项目名称,这会影响到变量如PROJECT_SOURCE_DIR。接下来设置C和C++的标准,因为LVGL要求C99及以上,而C++17可能是项目中的其他部分需要的。 然后注意到用户设置了EXECUTABLE_OUTPUT_PATH到bin目录,这样生成的可执行文件会集中管理。add_subdirectory添加子项目,比如lv_100ask_xz_ai和lvgl,这可能是第三方库模块。target_include_directories可能用于指定头文件路径,确保编译器能找到所需的头文件。 接下来是添加可执行文件main,并链接多个库,包括LVGL相关的库、SDL2、图像库、libdrm等。这里需要解释每个库的作用,比如SDL2处理显示和输入,libdrm可能与Linux的DRM驱动相关。最后,add_custom_target创建了一个自定义目标run,方便用户直接运行编译后的程序。 用户可能想知道每个步骤的必要性,以及如何根据他们的项目进行调整。比如是否需要所有依赖库,者如何添加新的源文件。此外,可能存在潜在问题,比如依赖库是否正确安装,路径是否正确,者链接顺序是否影响构建结果。需要提醒用户注意这些方面,并提供可能的解决方案检查步骤。 在解释过程中,还要注意用户可能的误区,比如为什么需要设置C标准,者为什么某些库需要显式链接。同,确保使用简单明了的中文,避免技术术语过于晦涩。最后,总结整个配置的作用,帮助用户整体理解CMakeLists.txt的结构和功能。</think>以下是对该CMake配置文件的逐层解析: 一、基础配置层 1. 版本声明 $$ cmake_minimum_required(VERSION 3.10) $$ • 强制要求CMake最低版本为3.10,确保兼容性 • 当版本满足会报错终止 2. 项目定义 $$ project(lvgl) $$ • 声明项目名称为"lvgl" • 自动生成相关变量:$\text{PROJECT\_SOURCE\_DIR}$, $\text{PROJECT\_BINARY\_DIR}$ 二、编译标准设置 ```cmake set(CMAKE_C_STANDARD 99) # 强制使用C99标准 set(CMAKE_CXX_STANDARD 17) # 强制使用C++17标准 set(CMAKE_CXX_STANDARD_REQUIRED ON) # 必须满足指定标准 ``` • LVGL官方要求C99及以上标准 • C++17标准可能用于项目中的C++组件 三、输出目录配置 ```cmake set(EXECUTABLE_OUTPUT_PATH ${PROJECT_SOURCE_DIR}/bin) ``` • 将可执行文件输出到项目根目录的bin文件夹 • 保持构建目录整洁,便于部署 四、子模块集成 ```cmake add_subdirectory(lv_100ask_xz_ai) # 添加自定义模块 add_subdirectory(lvgl) # 添加LVGL核心库 ``` • 假设存在lvgl和lv_100ask_xz_ai子目录 • 子目录需包含各自的CMakeLists.txt 五、可执行文件配置 ```cmake add_executable(main main.c mouse_cursor_icon.c) ``` • 创建名为main的可执行文件 • 包含两个源文件:main.c和mouse_cursor_icon.c 六、依赖管理 1. 图形库配置 ```cmake include(${CMAKE_CURRENT_LIST_DIR}/lvgl/tests/FindLibDRM.cmake) find_package(SDL2) find_package(SDL2_image) ``` • 引入LibDRM查找脚本 • 查找SDL2和SDL2_image库 2. 包含目录 ```cmake include_directories(${Libdrm_INCLUDE_DIRS} ${CMAKE_SOURCE_DIR}/lv_100ask_xz_ai ${SDL2_INCLUDE_DIRS} ${SDL2_IMAGE_INCLUDE_DIRS}) ``` • 添加DRM、自定义模块、SDL2相关头文件路径 七、链接配置 ```cmake target_link_libraries(main lv_100ask_xz_ai lvgl lvgl::examples lvgl::demos lvgl::thorvg ${SDL2_LIBRARIES} ${SDL2_IMAGE_LIBRARIES} ${Libdrm_LIBRARIES} m pthread freetype png) ``` • 链接顺序敏感:基础库在前,依赖库在后 • 包含: - LVGL核心库及其组件 - SDL2多媒体库 - Linux DRM图形驱动库 - 数学库(m)、线程库(pthread) - 字体渲染库(freetype) - PNG图像处理库 八、自定义目标 ```cmake add_custom_target(run COMMAND ${EXECUTABLE_OUTPUT_PATH}/lv_xiaozhiui DEPENDS main) ``` • 创建名为run的伪目标 • 编译后自动执行生成的可执行文件 • 需先构建main目标 九、潜在问题与建议 1. 路径问题: - 确保lvgl和lv_100ask_xz_ai子目录存在 - 检查FindLibDRM.cmake是否存在指定路径 2. 依赖管理: - 需提前安装SDL2、SDL2_image、libdrm等开发包 - 建议使用find_package()的REQUIRED参数确保依赖 3. 版本兼容性: - 确认LVGL版本与C99标准的兼容性 - 检查SDL2版本是否满足项目需求 4. 扩展建议: - 添加install()指令实现安装规则 - 使用target_compile_options()优化编译选项 - 考虑添加交叉编译支持 该配置展示了一个典型的嵌入式GUI应用构建方案,结合了LVGL核心库、硬件加速驱动和跨平台多媒体库,适用于需要图形界面且对性能有要求的嵌入式场景。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值