C# 防止错误结转的最佳方法?

C# 防止错误结转的最佳方法?,c#,floating-point,fixed-point,C#,Floating Point,Fixed Point,我有一个大的数据阵列,通过在250 kHz的电压下采样创建。我想将数据连同相关时间一起打印到一个文件中。我的第一个方法是这样做(在C中): 十进制dt=1m/采样器; 十进制t=0; for(int i=0;i

我有一个大的数据阵列,通过在250 kHz的电压下采样创建。我想将数据连同相关时间一起打印到一个文件中。我的第一个方法是这样做(在C中):

十进制dt=1m/采样器;
十进制t=0;
for(int i=0;i
显然,由于浮点数学的固有性质,这种方法开始累积错误,在数秒的数据之后,错误变得显著

我解决这个问题的方法如下:

decimal dt = (decimal)(1 / sampleRate);
decimal t = 0;
int seconds = 0;

for(int i = 0; i < dataArray.Length; i++)
{
    if(i % sampleRate == 0)
        {
            t = seconds;
            seconds++;
        }
    Writer.WriteLine(t + "\t" + dataArray[i]);

    t += dt;  
}
decimal dt=(十进制)(1/采样器);
十进制t=0;
整数秒=0;
for(int i=0;i
这使得每件事都能很好地同步,但看起来并不特别优雅。有没有更好的办法?最后,在最上面的方法中,使用t+=dt与带小数的t=i*dt有什么不同吗?双人间怎么样


编辑:正如已经指出的,十进制不是浮点。我应该在这里使用十进制还是双精度?

因为您使用的是
decimal
,所以您没有做浮点运算
decimal
基本上是一个定点数字。

您使用的是
decimal
,这是一个定点数字。您不应该有任何错误(当然,除非您的值超出了支持的
十进制范围)

不过,你的第一句话是不正确的。您正在进行整数运算(使用将产生整数结果),然后将其转换为十进制。您需要做一些不同的事情来正确地强制计算:

decimal dt = 1m / sampleRate;

sampleRate是什么类型的?sampleRate是一个整数,在本例中为250000。计算最后的速率。我不会对t使用浮点类型。使用整数类型,那么t就是“样本号”。然后,您可以编写一个函数,根据采样率将给定的采样数转换为以秒为单位的浮点值。那么你就没有错误积累,你可以完全访问样本数中的准确时间。我的印象是十进制比双精度更精确?我可能应该检查一下。你可能是指
decimal dt…
@SumuduFernando-这正是我的意思!固定的。太多关于双精度和十进制的思考了。啊!哎呀,我使用的实际代码略有不同。我甚至没意识到我把事情搞砸了。我编辑了这个问题来解决这个问题。
decimal dt = 1m / sampleRate;