我正在编写一个浮点打印和格式化库,并希望避免打印尾随零位。
为此,我想准确确定小数点后前 N 个小数位内的最后一个非零数字。我想知道是否有一种特别有效的方法可以做到这一点。
我正在编写一个浮点打印和格式化库,并希望避免打印尾随零位。
为此,我想准确确定小数点后前 N 个小数位内的最后一个非零数字。我想知道是否有一种特别有效的方法可以做到这一点。
这个(非平凡的)问题已经完全解决了。这个想法是打印足够多的数字,这样如果你将打印的数字转换回浮点数,你就会得到你开始的数字。
相关论文是 Robert Burger 和 R. Kent Dybvig 的“快速准确地打印浮点数”。你可以在这里下载。
您必须将浮点数转换为字符串,然后修剪尾随零。
我认为这不是很有效,但我觉得可能没有更简单的算法
显而易见的解决方案是将所有数字放入 achar[N]
并在打印前检查最后一位数字。但我敢打赌,你自己也考虑过。
我能想到的唯一其他解决方案是小数部分2^(-n)
有n
非零数字。
因此,如果二进制表示中的最后一个非零是2^(-n)
,那么十进制扩展中将恰好有n
非零数字。因此,查看二进制表示会告诉您有关十进制表示的一些信息。
但是,这只是部分解决方案,因为四舍五入可能会引入额外的尾随零。
std::cout.precision(n);
//其中n是您要在小数点后显示的数字。如果在精度限制之前但在小数点之后存在零,将自动避免。
eg. std::cout.precision(5);
然后我的条件被评估为 5.55000 只有 5.55 将被打印