.net 除使用小数外,处理双精度不精确

.net 除使用小数外,处理双精度不精确,.net,types,double,.net,Types,Double,我有一个普通数学运算的双精度问题。它是一个简单的加法,将一个00000000x附加到我的double 我读到应该用小数代替 但我使用的应用程序与统计数据相关,性能是个问题。我在某个地方读到过,从长远来看,小数会大大降低性能 在不使用Decimal数据类型的情况下,是否有任何合理的替代方案/方法可以避免不精确性?在完成所有计算后,最终将结果显示或存储为字符串时,舍入到所需的小数位数 例如,使用以下四位小数: double d = ___; string s = String.Format(

我有一个普通数学运算的双精度问题。它是一个简单的加法,将一个
00000000x
附加到我的double

我读到应该用小数代替

但我使用的应用程序与统计数据相关,性能是个问题。我在某个地方读到过,从长远来看,小数会大大降低性能


在不使用Decimal数据类型的情况下,是否有任何合理的替代方案/方法可以避免不精确性?

在完成所有计算后,最终将结果显示或存储为字符串时,舍入到所需的小数位数

例如,使用以下四位小数:

double d = ___;
string s = String.Format(
    System.Globalization.CultureInfo.InvariantCulture,
    "{0:0.0000}", d);
Console.WriteLine(s);
请注意,这并不意味着您将获得与使用铅笔和纸、手持计算器或无限精度数学计算相同的结果。也不意味着显示的结果是正确的+/-0.00005(对于上面的示例):中间计算可能会累积近似误差

下面展示了如何用科学符号完成类似的事情:

string s = String.Format(System.Globalization.CultureInfo.InvariantCulture,
    "{0:0.0000E0}", d);
有关自定义数字格式字符串的详细信息,请参见

如果您对以字符串形式实际显示或存储该值不感兴趣,另一个选项是在执行双精度中的性能关键计算后,将其转换为十进制,并进行四舍五入:

Decimal dec = Decimal.Round((Decimal)d, 4);

请注意,当需要与铅笔和纸张方法精确对应时,应在计算的所有步骤中使用
Decimal
,因为不存在基数10到基数2的转换以及与此类基数转换相关的相应近似误差。也就是说,
Decimal
并不是无限精确的:尽管对于最常见的用例(例如,许多金融计算),
Decimal
将“正常工作”。

统计数据何时精确?我实际上只需要最多4位小数,但由于这些细微的不一致性,我在将某些元素渲染到图形中时遇到了一些问题。我认为除了使用十进制之外,您无法做其他事情。也许如果你解释一下你遇到的渲染问题,我们可以找到一个解决方案。。只是觉得会有另一个解决办法。无论如何,我找到了一个解决办法。我使用for循环在点上迭代,最后一个渲染会以随机间隔被跳过。