我遇到了常见数学运算的双精度不精确问题。这是一个简单的添加会将00000000x
附加到我的双精度的那个。
我从another question读到应该使用小数。
但我使用它的应用程序是统计相关的,性能是一个问题。我从某处读到,从长远来看,Decimals会大幅降低性能。
如果不使用Decimal数据类型,是否有任何合理的替代方法/方法可以避免不精确?
答案 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>