如何确定浮点数中的最后一个非零十进制数?

时间:2012-05-11 17:45:45

标签: c++ floating-point ieee-754

我正在编写一个浮动打印和格式化库,并希望避免打印拖尾零位数。

为此,我想准确确定小数点后第N个小数位的最后一个非零数字。我想知道是否有一种特别有效的方法来做到这一点。

4 个答案:

答案 0 :(得分:3)

这个(非平凡的)问题已经完全解决了。我们的想法是打印足够的数字,这样如果您将打印的数字转换回浮点数,您就可以得到您开始使用的数字。

相关论文是Robert Burger和R. Kent Dybvig撰写的“快速准确地打印浮点数”。您可以下载here

答案 1 :(得分:1)

您必须将float转换为字符串,然后修剪尾随零。

我认为这不是很有效,但我觉得可能没有更简单的算法

答案 2 :(得分:0)

显而易见的解决方案是将所有数字放在char[N]中并在打印前检查最后一位数字。但我打赌你自己已经考虑过了。

我能想到的唯一其他解决方案是2^(-n)的小数部分有n个非零数字。

因此,如果二进制表示中的最后一个非零是2^(-n),则十进制扩展中将存在完全n个非零数字。因此,查看二进制表示将告诉您有关十进制表示的信息。

但是,这只是部分解决方案,因为舍入可能会引入额外的尾随零。

答案 3 :(得分:0)

std::cout.precision(n);

//其中n是小数点后要显示的数字。   如果精度限制之前存在零但是在十进制之后,   它会自动避免。

eg. std::cout.precision(5);

然后我的评估被评估为5.55000 只打印5.55