C#的可空类型、decimal相关

今天,我的C#代码抛异常了。代码如下,是RPC自动生成的代码。
<span style="font-family:Courier New;">static decimal? C(double x)
{
	return double.IsNaN(x) ? null : (decimal?)Math.Round((decimal)x, 6);
}</span>
这段代码涉及到了"值类型"和"可空类型"。
C# 2.0 中引入了可空类型,可空类型也是值类型,只是可空类型是包括null的值类型。
Decimal为SQL Server、MySql等数据库的一种数据类型,不属于浮点数类型,在.NET环境中,计算该类型的值会有性能上的损失,因为它不是基本类型。

以下代码测试了可空类型的使用,测试了decimal可存储的最大值,分析了C#的Exception表达的意思。

<span style="font-family:Courier New;">using System;
namespace Cs_Test_decimal
{
    class Program
    {
//      static double? t_double1(double x)
//      {//编译不过去,因为x是double类型,不是double?类型。需要强转一下才行。
//          return x >= double.MaxValue ? null : x;
//      }
        static double? t_double2(double x)
        {
            return x >= double.MaxValue ? null : (double?)x;
        }
        static string t_string(double x)
        {// "类似对象的类型"是可以为null的。所以不需要加问号和强转等措施。
            return x >= double.MaxValue ? null : Convert.ToString(x);
        }
        static decimal? t_decimal(double x)
        {
            return double.IsNaN(x) ? null : (decimal?)Math.Round((decimal)x, 6);
        }
        static void Main(string[] args)
        {
            try {
                double maxD = double.MaxValue;
                var testDecimal = (decimal)maxD;
            } catch (Exception ex)
            {
                string errorStr = "" + ex;
                Console.WriteLine(errorStr);
                //System.OverflowException: 值对于 Decimal 太大或太小。
                //在 System.Decimal..ctor(Double value)
                //在 System.Decimal.op_Explicit(Double value)
                //其中,ctor是constructor的意思,表示用double构造Decimal的过程中出错了。
            };

            double dTest = 1.0;
            for (int i = 1; i <= 40; ++i)
                dTest *= 10;
            //出现了一个有趣的现象:我想得到1.0E+40,结果得到了dTest = 9.9999999999999979E+39。
            try {
                // dTest = 1.0E+28 时候,没有抛异常。
                var testDecimal = (decimal)dTest;
            } catch (Exception ex)
            {
                Console.WriteLine("" + ex);
            };
        }
    }
}</span>
完。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值