我需要将浮点数转换为十进制(或其他基数)中的等效字符串。首先需要以xE 0格式进行转换,其中x是浮点数。
我的想法是首先将浮点数截断为一个临时整数,然后将该整数转换为字符串,然后考虑小数部分,将其乘以10,而小数部分不变为0.小数部分转移后在小数点的左侧,再次将整数应用于字符串函数,并将小数部分转换为字符串。有没有更好的方法,哪个比这更快?这种方法会引起任何副作用吗?
要将浮点数转换为指数表示,我应该如上所述,然后调整功率吗?或者直接对IEEE754浮点表示进行位掩码,并将每个部分转换为字符串。
解决方法
唯一确切的解决方案是对基本转换执行任意精度的十进制算术,因为精确值可能非常长 – 对于80位长的双倍,最多约10000个小数位。幸运的是,对于IEEE double来说,它“仅”大约700个左右。
相反,使用单个十进制数字,而不是工作基数为10亿(10位的最高功率适合32位整数),然后将这些“基数为10亿的数字”转换为9位十进制数字在你的计算结束时。
在LGPL MIT许可下,我有一个非常密集(相当难读)但有效的实现:
http://git.musl-libc.org/cgit/musl/blob/src/stdio/vfprintf.c?h=v1.1.6
如果你去除所有的六边形浮动支撑,无限/纳米支撑,%g /%f /%e变化支持,四舍五入(如果你只需要精确答案则永远不需要),以及你可能不需要的其他东西,剩下的代码很简单。