我正在编写一个浮动打印和格式化库,并希望避免打印拖尾零位数。
为此,我想准确确定小数点后第N个小数位的最后一个非零数字。我想知道是否有一种特别有效的方法来做到这一点。
答案 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