2010-09-29 68 views
2

我遇到了常见数学运算中的双精度不精确问题。这是一个简单的添加将追加00000000x我的双。处理双精度除了使用小数而不精确

我从another question读取应该使用小数代替。

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

是否有任何合理的替代方法/方法可以避免不精确而不使用Decimal数据类型?

+0

何时有统计数据? – leppie 2010-09-29 03:38:37

+0

实际上,我只需要最多4位小数位,但由于存在这些不均匀性,我在绘制某些元素时遇到了一些麻烦。 – Jonn 2010-09-29 04:19:31

+1

我不认为你可以做一些事情,而不是使用十进制代替。也许如果你解释你遇到的渲染问题,我们可以找到解决方案。 – 2010-10-07 12:14:07

回答

1

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

例如,使用下面的四个小数位:

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); 

有关自定义数字格式字符串的更多信息,请参见http://msdn.microsoft.com/en-us/library/0c899ak8.aspx

如果你不感兴趣,实际上显示或存储的值作为一个字符串,另一种方法是转换到Decimal和轮double执行性能关键的计算之后:

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

注意,当确切与铅笔和纸张方法的对应是必需的,因为没有基10到基2的转换以及与这种基转换相关的相应的近似误差,您应该在计算的所有步骤中使用Decimal。这就是说,Decimal不是无限的精确度:尽管对于最常见的用例(例如,多种财务计算)Decimal将会“正常工作”,但仍然会遇到近似误差。