gpt4 book ai didi

c++ - 在不强制固定宽度的情况下删除 float 的科学记数法

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:03:32 26 4
gpt4 key购买 nike

我正在使用 ofstream 输出 float CSV。 99% 的 float 的精度为 1-2 位小数,因此只需使用 fileOut.precision(3) 就足以强制实现正确的精度。

时不时地,一个 float 将具有极低的值,因此将以科学记数法即 1e-007 输出。在这种情况下,我希望 0

这里的很多答案建议使用类似于 fileOut.setf(std::ios::fixed, std::ios::floatfield); 的东西来防止这种情况,但这会使每个字段输出为 0.000,不管它是否需要那么多数字。

我希望所有 float 都能正常运行,而不显示科学记数法。

有没有办法做到这一点,或者我是否必须创建一个简单的函数来检查数字是否低于,比如说,0.001,如果是,则将其设置为 0?

更新:

我现在使用以下代码来环绕任何 float ,它并不理想但有效。

float _RoundToZero(float in, int precision = 2)
{
return in <= (1 / powf(10,precision)) ? 0.0 : in;
}

最佳答案

考虑将乘以 100 的值打印为整数(为准确起见进行四舍五入)。这样虽然有时您会得到尾随零,但您永远不必打印小数位,这会浪费每个值 1 个字符。

或者,将 float 写成二进制。由于所有 float 都具有相同的大小(4 字节),因此您可以保留原始数据的所有精度而不必担心尾随零,您的文件大小非常可预测并且您不必浪费空间来分隔值。 100 个值占用 400 个字节。在文本格式中,一个值最少需要 2 个字节(数字 + 字段定界符),最多需要您的格式允许的任何字节(包括一个小数点)加上定界符。在这种格式中,4 个字节可以获得 2 个有效精度数字,而不是 float 的 5 或 6 个。

关于c++ - 在不强制固定宽度的情况下删除 float 的科学记数法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11120473/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com