圆形双打操作

时间:2013-02-15 16:56:14

标签: c# double rounding

假设我有三个双打,a,b和c。

double a = 1.234560123;
double b = 7.890120123;

double c = a * b;

c = 9.740827669535655129

我想处理只有5位小数的数字。所以,如果我使用Math.Round(a,5)和Math.Round(b,5)对a和b进行舍入,我得到:

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以及在其他操作中使用此操作的结果,我不希望每次都对所有中间结果进行舍入,以免传播由不需要的小数位引起的错误。

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

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

您无法定义具有有限小数位的双精度型。您应该在显示时依赖格式化数字。见 this question

答案 2 :(得分:-1)

我找到了一种使用Operator Overload解决问题的方法。

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

一个例子:

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

    return result;
}