gpt4 book ai didi

c++ - sprintf 中 Windows 与基于 Unix 的系统的舍入差异

转载 作者:可可西里 更新时间:2023-11-01 12:42:07 26 4
gpt4 key购买 nike

我在基于 UNIX 的系统上遇到问题 sprintf 没有正确地舍入值。

例如

double tmp = 88888888888885.875
char out[512];

那是 88,888,888,888,885.875 只是为了让眼睛更舒服。我给出了如此具体和重要的例子,因为它似乎适用于较小的数字。

我正在尝试按以下方式使用它

sprintf(out, "%021.2f", tmp);
printf("out = %s\n", tmp);

在 Windows 上,这会导致:

out = 000088888888888885.88

例如在 AIX 上,但在 Linux 中也显示:

out = 000088888888888885.87

为什么会这样?任何想法以及如何使其在 Win/Unix 上以相同的方式运行

谢谢

最佳答案

有一个bug report对于问题与您的问题非常相似的 glibc。这里的主要结论(在评论 46 中)是 double 不是 15 位十进制数字,您不应该期望它会那样工作。

作为一种解决方法,您可以在数字中添加一些小的东西,使它们更圆润。但是这个解决方案并不通用,因为它取决于您处理的数字范围。

另一种解决方法是乘以准备四舍五入,然后四舍五入(例如 2597.625*100 = 259762.5 -> 259763 = 2597.63*100)

但是我认为必须有更聪明的解决方法。

关于c++ - sprintf 中 Windows 与基于 Unix 的系统的舍入差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4649554/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com