浮点数、数学计算与随机数

浮点数用于处理包含小数部分的实数,C#中的浮点数类型包括float和double,此外,还可以使用decimal类型处理精度更高的实数。

float和double类型

float称为单精度浮点数,double称为双精度浮点数;代码中,浮点数的字面量默认为double类型,如果明确指定字面量为float类型,可以在数字后使用字母f或F指定,如下面的代码。

C#
using System;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            float x = 0.9F;
            Console.WriteLine(x);
        }
    }
}

代码执行结果如下图。

float和double类型在数据数据时,会有一些的精度范围,代码中,如果对数据精度有很高的要求,可以使用decimal类型。

除了使用F表示float字面量,还可以使用D标识表示double数据字面量,如1D;数据字面量需要指定decimal类型时,可以使用M标识,如1.0M。

算术运算与类型转换

浮点数同样可以进行加、减、乘、除和求数据运算,如下面的代码。

C#
using System;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            double x = 1.1;
            double y = 0.3;
            Console.WriteLine("x + y = {0}", x + y);
            Console.WriteLine("x - y = {0}", x - y);
            Console.WriteLine("x * y = {0}", x * y);
            Console.WriteLine("x / y = {0}", x / y);
            Console.WriteLine("x %% y = {0}", x % y);
        }
    }
}

代码执行结果如下图。

我们可以看到,浮点数的算术运算结果依然是浮点数。那么,当浮点数和整数一起运算时,会有什么结果呢?

默认情况下,同样遵循一个基本原则:先将取值范围小的类型转换为聚会范围大的类型,然后进行计算,最后的运算结果是取值范围大的类型。

需要将取值范围大的数据转换为取值范围小的类型时,可以使用强制转换,在需要转换的数据前使用一对圆括号指定目标类型,如下面的代码。

C#
using System;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            double x = 1.5;
            long y = (long)x;
            Console.WriteLine(x);
            Console.WriteLine(y);
        }
    }
}

代码执行结果如下图。

我们可以看到,将浮点数换为整数时,会直接抛弃小数部分,并不会进行四舍五入;如果需要在截断小数位时进行相关处理,可以使用Math类中的几个方法,如:

  • Math.Round(x, n)方法,返回x的n位小数,如果不指定n,则返回最接近的整数部分,请注意,此方法会返回x的类型,如double、decimal。此外,在转换时会使用“四舍六入五成双”的规则,即4舍去、6进位、5则取最近的偶数。
  • Math.Floor(x)方法,返回小于等于x的最大整数,返回数据类型与x相同,如double、decimal类型。
  • Math.Ceiling(x)方法,返回大于等于x的最小整数,返回数据类型与x相同,如double、decimal类型。

下面的代码演示了这三个方法的应用。

C#
using System;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            double x = 1.45;
            double y = 3.62;
            Console.WriteLine(Math.Round(x));
            Console.WriteLine(Math.Round(y));
            Console.WriteLine(Math.Floor(x));
            Console.WriteLine(Math.Floor(y));
            Console.WriteLine(Math.Ceiling(x));
            Console.WriteLine(Math.Ceiling(y));
        }
    }
}

代码执行结果如下图。

Math类

System.Math类中定义了大量的数学相关字段和静态方法,如E和PI分别表示e常量和圆周率,常用的Abs()、Max()、Min()、Sqrt()等函数也都在其中,此外,大量的三角函数也有定义,大家可以在帮助文档中查询完成的说明。下面的代码,我们计算一个圆的周长和面积。

C#
using System;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            double radius = 1.5;
            Console.WriteLine("半径 {0} 周长 {1}",
                 radius, 2 * radius * Math.PI);
            Console.WriteLine("半径 {0} 面积 {1}",
                 radius, radius * radius * Math.PI);
        }
    }
}

代码执行结果如下图。

随机数

System.Random类用于生成各种随机数,下面的代码,我们以Next()方法为例。

C#
using System;
namespace HelloProject
{
    class Program
    {
        static void Main(string[] args)
        {
            Random rnd = new Random();
            Console.WriteLine(rnd.Next());
            Console.WriteLine(rnd.Next(10));
            Console.WriteLine(rnd.Next(10, 99));
        }
    }
}

由于是生成随机数,所以每次执行的结果可能不同。代码中,我们使用了Next()的三个重载版本,分别是:

  • Next(),返回大于等于0,并小于System.Int32.MaxValue的随机整数。
  • Next(max),返回大于等于0,并小于max的随机整数。
  • Next(min,max),返回大于等于min,并小于max的随机整数。
本站内容均为原创作品,转载请注明出处,本页面网址为:http://caohuayu.com/chy/article/Article.aspx?code=cc002006