您知道如何在不分配任何内存的情况下将float转换为chars缓冲区吗?

=>我只是想重新做与float.ToString()一样的事情;所以我可以将结果放入缓冲区,而不是分配字符串

我写了一个函数,但是它不能很好地处理“四舍五入”:


39.71变成“ 39.709996”
39.71001变为“ 39.710004”


这是因为39.71作为浮点数是对内存中存储的值39.709996的舍入。通过对函数进行四舍五入,我可以轻松得出如下结果:


39.71变为“ 39.71”
39.71001变为“ 39.71”


这也不是什么好事,因为我想保留与float.ToString()完全相同的算法,该算法设法编写“ 39.71”和“ 39.71001”

您知道这个float.ToString()是如何工作的吗?

我的目标很精确:我想在一个很大的字符串中添加大量的float(与其他类型混合),并在最后只分配一次此字符串,以避免过多的垃圾回收。因此,我确实需要将float转换为char数组(无论确切的类型格式,只有不可变的字符串)

最佳答案

您可以致电C stdlib sprintf()和朋友来解决大多数格式和数据问题。有关示例,请参见https://stackoverflow.com/a/2479210/3150802。通过评估sprintf()的返回值来跟踪打印位置(即char数组的索引)非常重要。

跨越管理/非管理边界会不可避免地带来一些性能损失。一种可能的缓解策略是减少此类交叉的次数,例如,通过编写一个C包装函数,该函数可以接收大的浮点数,并使用s*printf()一次性全部写入。

如果像浮点数和地址这样的POD在两个领域中都是位相同的,那么数据封送处理(即CLI和本机表示形式之间的来回转换)的潜在代价可能不是问题。

关于c# - 将浮点数转换为char []而不分配内存,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/41239089/

10-12 19:08