0

我正在创建一个二进制文件。文件的内容是双精度值。当我使用二进制读取器提取双精度值时,小数点后的某些值不匹配

例如:写入文件的值。-0.0139519833028316

从文件中提取的值。-0.0139519833028317

我怎样才能避免这种不一致?

aStreamWriter.WriteLine(double values);

//to read the data ,
BinaryReader aBinaryReader = new BinaryReader();
int points_length = CurveCount * VectorLength * 2 * VoxelIndex.Length * 2;
double[] points = new double[points_length];
for (int i = 0; i < points_length; i++)
    points[i] = aBinaryReader.ReadDouble();
for(int i =0; i < points_length; i++) {
    // then write the points values to a file
}
4

3 回答 3

0

编辑:

有了你的评论,问题就变得很明显了。StreamWriter是一个文字作家。调用aStreamWriter.WriteLine(double)是写text。坦率地说,你很幸运能拿回任何东西


原来的

工作正常:

    double d = -0.0139519833028316;
    byte[] raw;
    using (var ms = new MemoryStream())
    {
        using (var writer = new BinaryWriter(ms))
        {
            writer.Write(d);
        }
        raw = ms.ToArray();
    }
    double newVal;
    using(var ms = new MemoryStream(raw))
    using (var reader = new BinaryReader(ms))
    {
        newVal = reader.ReadDouble();
    }
    Console.WriteLine(newVal == d); // True

我怀疑您只是看到double了与读/写代码完全无关的奇怪现象。

于 2012-11-26T12:55:20.603 回答
0

基本上你有一个双数据类型的问题。Double 基本上是对一个以 2 (2^64) 为底的数字进行近似。如果没有可以计算的确切数字(从 10 为底),那么它会选择关闭数字,可以将其保存为双精度数。

如果您需要超级精确的方法来保存一些数字,请将其保存为字符串。取决于数学或您需要对数字做什么,您始终可以编写自己的函数。

将“货币价值”保存为数据库中的浮点数正在发生类似的事情。他们使用金钱数据类型,因为浮点数并不是真正可行的方法。

于 2012-11-26T13:21:08.500 回答
0

真的是前后矛盾吗?double 在概念上是一个实数的近似值。考虑到原始测量的误差,该数字是否重要?在这种情况下,它们不是真正的“相同”数字吗?

于 2012-11-26T12:54:19.247 回答