2013-02-15 102 views
0

假设我有三个双打,a,b和c。四舍五入操作

double a = 1.234560123; 
double b = 7.890120123; 

double c = a * b; 

c = 9.740827669535655129 

我想使用只有5位小数的数字。所以,如果我圆a和b使用Math.Round(一,5)和Math.Round(B,5)我得到:

double a_r = Math.Round(a, 5); 
double b_r = Math.Round(b, 5); 

a_r = 1.23456 
b_r = 7.89012 

double c_r = a_r * b_r; 

c_r = 9.7408265472 

但是当我计算C,我还是得到了一些有超过5小数位(这将发生在每次乘法,除法,增强和类似操作中)。我可以将所有结果放在我的代码中,但这是我想避免的难题。

由于我在其他操作中使用c和其他操作的结果,所以我不希望每次都舍入所有中间结果,以免传播由不需要的小数位引起的错误。

有没有办法用固定的小数位数来定义双精度,与运算无关?

+1

里德给下面你的答案通过谷歌搜索:) – Brian 2013-02-15 16:58:46

+1

你为什么要限制你的准确度一样,很容易被发现的?只想显示一定数量的小数位是很常见的,但我想不出有什么理由来人为限制计算中使用的小数位数。 – anaximander 2013-02-15 17:02:31

+0

@anaximander这是特别真实的,因为他使用的精度比那个更高... – 2013-02-15 17:04:04

回答

-1

我找到了一种方法来解决我的问题,使用运算符重载。

所以我重新定义了我所有的操作:乘法,除法,复数乘法和矩阵运算,将结果四舍五入到我想要的小数位数。

一个例子:

public static double operator *(double d1, double d2) 
{ 
    double result; 
    result = Math.Round(d1 * d2, 5); 

    return result; 
} 
4

通常情况下,这是最好的留在双打到位,使用自定义格式显示值5个小数点:

double a = 1.234560123; 
double b = 7.890120123; 

double c = a * b; 

Console.WriteLine("Result = {0:N5}", c); 

几乎是转换数值转换为字符串的所有程序允许使用的Standard Numeric Format Strings以及Custom Numeric Format Strings

+0

问题是我用c来制作其他人和其他人的操作,我不想传播由不太重要的小数位引起的结果差异。 我不想做一轮或类似的东西,永远得到我的中间结果。 – 2013-02-15 17:05:22

+0

@GuilhermeCampos你可以倒圆角,但双精度很少精确。最好保持原来的精度,然后在最后格式化输出。有关详细信息,请参阅:http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html – 2013-02-15 17:11:16