System.Decimal与decimal类型初始化、类型别名及货币适配咨询
嘿,我来帮你理清这几个关于decimal的疑问:
1. 类型别名必须用对象类型?这认知不对哦
你觉得用类型别名时必须采用对象类型而非原始类型?其实完全不是这样的。在C#里,using别名指令可以给任何合法类型起别名——不管是值类型(比如decimal本身就是值类型,对应CLR的System.Decimal)、引用类型,甚至泛型类型都可以。
举个实际的例子,你想给decimal起个货币相关的别名,直接这么写就行:
// 用CLR类型名或者C#关键字都可以 using Currency = System.Decimal; // 或者更简洁的:using Currency = decimal;
这两种写法都合法有效,根本不需要局限于“对象类型”(而且decimal本身也不是引用类型,属于值类型哦)。
2. 初始化£30的问题:直接写符号会报错,得换方式
你说习惯把decimal初始化为£30,但C#的数值字面量语法不允许直接把货币符号当前缀用——写£30会直接触发编译错误,这就是你遇到“无法用某方式初始化”的原因。正确的做法分两种场景:
如果是固定金额,不需要处理符号:直接用带
m后缀的数值就行(m是decimal的专属后缀,避免编译器默认把数值解析成double):decimal amount = 30m;如果要从带英镑符号的字符串初始化(比如用户输入的
"£30"):用decimal.Parse或者更安全的decimal.TryParse,记得指定英国文化信息和货币格式:var ukCulture = new System.Globalization.CultureInfo("en-GB"); // Parse方式(失败会抛异常) decimal amount = decimal.Parse("£30", System.Globalization.NumberStyles.Currency, ukCulture); // 推荐用TryParse,避免解析失败崩溃 if (decimal.TryParse("£30", System.Globalization.NumberStyles.Currency, ukCulture, out var parsedAmount)) { // 这里使用parsedAmount就没问题啦 }
3. 这些初始化方式适合货币场景吗?必须适合啊
decimal本来就是为精确的十进制计算设计的,完美适配货币场景,这两种初始化方式都没问题:
用
30m这种字面量:是货币开发里最常用的固定金额初始化方式,完全不会有float/double那种浮点精度丢失的问题,计算精准可靠。解析带符号的字符串:适合处理用户输入、外部数据里的货币值,只要你指定对了文化信息(比如英镑对应en-GB)和格式样式,就能安全把带符号的金额转成decimal,同样适合货币场景。
小提醒:整个货币计算过程都要坚持用decimal,别和float/double混着用,不然精度坑等着你哦。
内容的提问来源于stack exchange,提问作者w0051977

