假设我有三个双打,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以及在其他操作中使用此操作的结果,我不希望每次都对所有中间结果进行舍入,以免传播由不需要的小数位引起的错误。
有没有办法用固定的小数位数来定义双精度数,与操作无关?
答案 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;
}