0

假设我有三个双打,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 并且在其他操作中使用此操作的结果,我不想每次都舍入所有中间结果,以免传播由不需要的小数位引起的错误。

有没有一种方法可以独立于操作来定义具有固定小数位数的双精度数?

4

3 回答 3

4

通常,最好保留双精度,并使用自定义格式将值显示到小数点后 5 位:

double a = 1.234560123;
double b = 7.890120123;

double c = a * b;

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

几乎所有将数值转换为字符串的例程都允许使用标准数字格式字符串以及自定义数字格式字符串

于 2013-02-15T16:58:05.020 回答
0

您不能定义具有有限小数位的双精度。您应该在显示数字时依靠格式化数字。看到这个问题

于 2013-02-15T17:19:42.947 回答
-1

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

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

一个例子:

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

    return result;
}
于 2013-02-15T19:25:25.240 回答