除了使用小数之外,处理双打不精确

时间:2010-09-29 03:21:01

标签: .net types double

我遇到了常见数学运算的双精度不精确问题。这是一个简单的添加会将00000000x附加到我的双精度的那个。

我从another question读到应该使用小数。

但我使用它的应用程序是统计相关的,性能是一个问题。我从某处读到,从长远来看,Decimals会大幅降低性能。

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

1 个答案:

答案 0 :(得分:1)

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

例如,使用以下4个小数位:

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

请注意,当需要与铅笔纸方法完全对应时,您应该对计算的所有步骤使用Decimal,因为没有base-10到base-2转换以及相应的近似误差与此类基本转换相关联。话虽如此,Decimal并不是无限制的精确度:仍然存在遇到近似误差的方法,但对于最常见的用例(例如,多种财务计算)Decimal将“正常工作”。 / p>