我遇到了常见数学运算中的双精度不精确问题。这是一个简单的添加将追加00000000x
我的双。处理双精度除了使用小数而不精确
我从another question读取应该使用小数代替。
但我使用这个应用程序是统计相关的,性能是一个问题。我从某个地方看到,长远来说,小数会大大降低性能。
是否有任何合理的替代方法/方法可以避免不精确而不使用Decimal数据类型?
我遇到了常见数学运算中的双精度不精确问题。这是一个简单的添加将追加00000000x
我的双。处理双精度除了使用小数而不精确
我从another question读取应该使用小数代替。
但我使用这个应用程序是统计相关的,性能是一个问题。我从某个地方看到,长远来说,小数会大大降低性能。
是否有任何合理的替代方法/方法可以避免不精确而不使用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);
有关自定义数字格式字符串的更多信息,请参见http://msdn.microsoft.com/en-us/library/0c899ak8.aspx。
如果你不感兴趣,实际上显示或存储的值作为一个字符串,另一种方法是转换到Decimal
和轮double
执行性能关键的计算之后:
Decimal dec = Decimal.Round((Decimal)d, 4);
注意,当确切与铅笔和纸张方法的对应是必需的,因为没有基10到基2的转换以及与这种基转换相关的相应的近似误差,您应该在计算的所有步骤中使用Decimal
。这就是说,Decimal
不是无限的精确度:尽管对于最常见的用例(例如,多种财务计算)Decimal
将会“正常工作”,但仍然会遇到近似误差。
何时有统计数据? – leppie 2010-09-29 03:38:37
实际上,我只需要最多4位小数位,但由于存在这些不均匀性,我在绘制某些元素时遇到了一些麻烦。 – Jonn 2010-09-29 04:19:31
我不认为你可以做一些事情,而不是使用十进制代替。也许如果你解释你遇到的渲染问题,我们可以找到解决方案。 – 2010-10-07 12:14:07