【发布时间】:2026-01-07 20:00:01
【问题描述】:
我在我的项目中完全实现了 fmt 库。但我发现的最后一个错误是,以前的值四舍五入到上限 (0.5 -> 1),而现在它们四舍五入到下限 (0.5 -> 0)。
在尝试查找原因时,我发现:
double halfd = 0.5;
std::string str = fmt::format("{:.0f}", halfd ); // result: "0"
float halff = 0.5f
std::string str = fmt::format("{:.0f}", halff ); // result: "0"
我也试过,如果编译器可能将 0.5 存储为 0.49999999999...,但我找不到原因。
我使用带有 v140 编译器的 Microsoft Visual Studio 2017。
有人知道为什么 fmt 将 0.5 舍入为 0,而不是 1。我以前使用标准的 printf 库。
【问题讨论】:
-
Floris Jonkman 为什么你认为 1.0 是正确的结果而不是 0.0?
-
@chux-ReinstateMonica 在数学中通常将 0.5 舍入到 1.0。他在问为什么这与 fmt 不同,因为他可能不了解 IEEE 754 舍入合规性。