我们现有的应用程序从文件中读取一些浮点数.这些数字是由其他一些应用程序写的(我们称之为应用程序B).此文件的格式很久以前就已修复(我们无法更改).在此文件中,所有浮点数都以二进制表示形式保存为浮点数(文件中为4个字节).
在我们的程序中,一旦我们读取数据,我们就将浮点数转换为双精度数并使用双精度数进行所有计算,因为计算非常广泛,我们关注舍入误差的传播.
我们注意到,当我们通过十进制转换浮点数时(参见下面的代码),我们得到的结果比直接转换时更精确.注意:应用程序B也在内部使用双精度数,只将它们作为浮点数写入文件中.假设应用程序B将数字0.012写入文件为float.如果我们在读取到十进制后转换它然后加倍我们得到0.012,如果我们直接转换它,我们得到0.0120000001043081.
这可以在不读取文件的情况下重现 - 只需一个作业:
float readFromFile = 0.012f;
Console.WriteLine("Read from file: " + readFromFile);
//prints 0.012
double forUse = readFromFile;
Console.WriteLine("Converted to double directly: " + forUse);
//prints 0.0120000001043081
double forUse1 = (double)Convert.ToDecimal(readFromFile);
Console.WriteLine("Converted to double via decimal: " + forUse1);
//prints 0.012
Run Code Online (Sandbox Code Playgroud)
通过十进制从float转换为double总是有益的,如果不是,在什么条件下它是有益的?
编辑:应用程序B可以通过两种方式获取它保存的值:
我们目前正在使用压缩ICsharpCode.SharpZipLib库的GZipOutputStream类.我们从一个线程做到这一点.
我想将输入数据流拆分为块并并行压缩它们.我担心这个库可能有一些静态内部将被多个线程覆盖,因此破坏了生成的流.
任何想法将不胜感激.