2

我在我的项目中完全实现了 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 库。

4

1 回答 1

2

正如对此github 问题的评论{fmt} 使用舍入到最接近的偶数模式,这是 IEEE 754 中的默认舍入模式。glibcprintf默认情况下也是如此:https ://godbolt.org/z/jfor1cedo 。

于 2021-04-13T19:01:21.487 回答