构建高质量的C#代码
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

代码 2-9:计算两点间距离(<MathDemo>\Program.cs)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace MathDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            //点一坐标
        double x1 = 100D, y1 = 100D;
        //点二坐标
        double x2 = 200D, y2 = 200D;
        //计算距离
        double interval =
            Math.Sqrt(Math.Pow(x2- x1, 2D) + Math.Pow(y2- y1, 2D));
        //显示结果
        Console.WriteLine("两点距离:{0}", interval);
    }
}
}

代码中,我们使用Math类中的Pow()方法进行数值的幂运算,分别计算横坐标长度的平方和纵坐标长度的平方,然后通过Sqrt()方法计算这两个值相加后的算术平方根,最终得出了两点的距离,运行结果如图2-5所示。

图2-5

2.3.2 高质量代码准则:合理使用浮点数和decimal类型

1. 浮点数的比较

首先,我们思考下面这条语句的运算结果:

Console.WriteLine(1.000000101F == 1.000000109F);

这条语句的功能是测试两个值是否相等。请注意,在C#中的等于比较运算符是两个等号(==),初学者经常在这里少输入一个等号,结果程序产生了难以查找的错误。与此相反的,不等于比较运算符是由一个叹号和一个等号组成的,即“!=”。

从字面上看,它们似乎是不相等的。但实际上,这条语句的输出结果是true,即两个数值相等。这是因为,我们将两个数值的字面值指定成了float类型,而float的精度只有7位小数左右,多出的小数位将会被丢弃,所以造成了两个数比较的结果是相等的。如果我们将两个数的字面值指定为D,即设置为double类型,则比较的结果是false,这是因为double的精度大约为15~16位小数,代码如下:

Console.WriteLine(1.000000101D == 1.000000109D);

这就是我们使用浮点数应该注意的第一个问题,即在判断两个浮点数是否相等时,应该特别小心浮点数支持的精度。而对于decimal数据类型,相信其精度已经足够我们的程序使用了。

另外,在比较两个数据是否相等时,我们还可以使用Equals()方法来进行判断,代码2-10演示了此方法的使用。