使用sprintf在Windows和基于Unix的系统上舍弃差异

我在基于UNIX的系统上遇到问题,sprintf没有正确收集价值。

例如

double tmp = 88888888888885.875 char out[512]; 

那888888888888885.875只是为了眼睛更容易。 我正在给这样的具体和大的例子,因为它似乎在较小的数字上工作正常。

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

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

Windows上,这导致:

 out = 000088888888888885.88 

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

 out = 000088888888888885.87 

为什么发生这种情况? 任何想法,以及如何使其在Win / Unix上performance相同的方式

谢谢

Solutions Collecting From Web of "使用sprintf在Windows和基于Unix的系统上舍弃差异"

glibc有一个与你的问题非常相似的错误报告 。 这里的主要结论(在评论46)是double不是一个15位数的数字,你不应该指望它像那样工作。

作为一种解决方法,您可以添加一些小的数字,使他们更好。 但是这个解决方案不是一般的,因为它取决于你处理的数字范围。

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

不过,我认为必须有更明智的解决方法。

处理器和编译器使用哪些浮点表示?

并不是所有的处理器都使用相同的方式来表示浮点值,甚至编译器也可能选择不同的浮点表示方法(我认为Microsoft C ++编译器甚至可以选择表示形式)。

页面http://www.quadibloc.com/comp/cp0201.htm给出了一些浮点表示的概述(尽管它们似乎是那里显示的相当老的体系结构)。

http://msdn.microsoft.com/en-us/library/0b34tf65.aspx描述Microsoft Visual C ++如何存储浮点值。 我无法立即找到AIX或Linux使用的表示法。

另外,每个编译器都有一些选项可以让你指出你想如何使用浮点运算。 你想让他们尽可能正确(但可能有点慢)? 还是你想浮点运算尽可能快(但可能不太正确)?

那是因为你使用double精度限制,也就是说,你的88888888888885.875可能被内部四舍五入为其他东西。

在类似的问题 ,在博客或维基百科中查看更多信息。

在符合IEEE 754的实现中,它应该以默认舍入模式打印88888888888885.88 。 这与浮点精度无关,因为该值是完全可表示的; 这仅仅是printf在小数点后两位的四舍五入的问题。 不知道为什么你在某些系统上看到88888888888885.87