浮点类型的特征
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);
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;
示例代码如下:
cs
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 方法来说,通常的做法是返回一个能够描述对象状态的字符串。