014集——浮点数值类型——C#学习笔记

浮点类型的特征
C# 支持以下预定义浮点类型:



double a = 12.3;
System.Double b = 12.3;
每个浮点类型的默认值都为零,0。 每个浮点类型都有 MinValue 和 MaxValue 常量,提供该类型的最小值和最大有限值。 float and double 类型还提供可表示非数字和无穷大值的常量。 例如,double 类型提供以下常量:Double.NaN、Double.NegativeInfinity 和 Double.PositiveInfinity。

当所需的精度由小数点右侧的位数决定时,decimal 类型是合适的。 此类数字通常用于财务应用程序、货币金额(例如 $1.00)、利率(例如 2.625%)等。 精确到只有一个小数的偶数用 decimal 类型处理会更准确:例如,0.1 可以由 decimal 实例精确表示,而没有精确表示 0.1 的 double 或 float 实例。 由于数值类型存在这种差异,因此当你对十进制数据使用 double 或 float 时,算术计算可能会出现意外的舍入错误。 当优化性能比确保准确度更重要时,可以使用 double 代替 decimal。 然而,除了大多数计算密集型应用程序之外,所有应用程序都不会注意到性能上的任何差异。 避免使用 decimal 的另一个可能原因是为了最大限度地降低存储需求。

可在表达式中将整型类型与 float 和 double 类型混合使用功能。 在这种情况下,整型类型隐式转换为其中一种浮点类型,且必要时,float 类型隐式转换为 double。 此表达式的计算方式如下:

如果表达式中有 double 类型,则表达式在关系比较和相等比较中求值得到 double 或 bool。
如果表达式中没有 double 类型,则表达式在关系比较和相等比较中求值得到 float 或 bool。
你还可在表达式中混合使用整型类型和 decimal 类型。 在这种情况下,整型类型隐式转换为 decimal 类型,并且表达式在关系比较和相等比较中求值得到 decimal 或 bool。

不能在表达式中将 decimal 类型与 float 和 double 类型混合使用。 在这种情况下,如果你想要执行算术运算、比较运算或相等运算,则必须将操作数显式转换为 decimal 或反向转换,如下例所示:

double a = 1.0;
decimal b = 2.1m;
Console.WriteLine(a + (double)b);
Console.WriteLine((decimal)a + b);

上图可见,decimal精度比double高。

double d = 3D;
d = 4d;
d = 3.934_001;

float f = 3_000.5F;
f = 5.4f;

decimal myMoney = 3_000.5m;
myMoney = 400.75M;

示例代码如下:

using System;
using System.Globalization;

namespace StringApplication
{
    class zz银行
    {
        protected decimal MyFortune = 0m;

        public zz银行()
        {
            /*m 后缀用于表示一个数值字面量是 decimal 类型的。decimal 类型用于需要高精度的财务和货币计算。
             * 它提供了比 float 和 double 类型更高的精度和更小的范围,非常适合处理金融数据。
            当你看到 0m 时,这意味着数字 0 被明确指定为 decimal 类型,而不是默认的 int、float 或 double 类型。
            这样做的好处是,你的代码意图更加清晰,
            同时也避免了在将整数或浮点数赋值给 decimal 变量时可能发生的隐式类型转换。*/
            MyFortune = 0m;
            
        }

        public void AddPenny(decimal i)
        {
            MyFortune += i ;
        }
        //扩展或修改继承的方法、属性、索引器或事件的抽象或虚拟实现需要 override 修饰符。
        public override string ToString()
        {
            /*ToString 方法用于将数值、日期、时间等对象转换为它们的字符串表示形式。
             * 对于数值类型(如 decimal),ToString 方法可以接受一个格式字符串作为参数,以指定输出字符串的格式。*/
            var usFormat = new CultureInfo("en-US");
            //return " zz银行的余额为:" + MyFortune.ToString("C") ;¥人民币单位
            return " zz银行的余额为:" + MyFortune.ToString("C", usFormat); //$美元单位
            //return " zz银行的余额为:" + MyFortune.ToString("F5", usFormat); //$美元单位,保留5为小数,即F5
            /*关于 "C" 格式说明符:
            使用当前区域性的货币符号(如美元符号$、欧元符号€等)。
            根据需要添加千位分隔符。
            根据当前区域性的设置来格式化小数点后的数字(通常是两位,但这也取决于区域性的具体设置)。
            因此,如果 MyFortune 的值是 123.45m,并且当前线程的区域性设置为美国英语(en-US),
            那么 MyFortune.ToString("C") 将返回类似 "$123.45" 的字符串。
            如果当前线程的区域性设置为其他货币体系,返回的字符串将相应地反映该货币体系的格式。*/
        }

        public static void Main()
        {
            zz银行 bank = new zz银行();
            bank.AddPenny(2.666666m);
            Console.WriteLine(bank);
            Console.ReadLine();
        }
    }
}

在C#中,public override string ToString() 这句代码定义了一个方法(Method),这个方法重写了(Overrides)从基类继承而来的 ToString 方法。这里有几个关键点需要理解:

public:这是一个访问修饰符,表示这个方法是公开的,意味着它可以被任何其他类访问。
override:这个关键字用于指示该方法重写了基类中的虚方法(virtual method)或抽象方法(abstract method)。如果没有 override 关键字,并且基类中没有相应的虚方法或抽象方法,那么尝试定义这样一个方法将会导致编译错误。
string:这是方法的返回类型,表示该方法执行后将返回一个字符串(String)类型的值。
ToString:这是方法的名称。ToString 方法在.NET中是一个非常特殊的方法,因为几乎所有.NET对象都继承自 System.Object 类,而 System.Object 类中定义了一个 virtual 的 ToString 方法。这意味着,除非在派生类中重写 ToString 方法,否则调用任何对象的 ToString 方法时,都会返回该对象的类名加上其哈希码的字符串表示(这通常不是很有用)。
方法体(在您的例子中未给出):这是方法内部执行的代码,定义了当调用该方法时应该执行什么操作。对于 ToString 方法来说,通常的做法是返回一个能够描述对象状态的字符串。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值