【问题标题】:Cast a Double Variable to Decimal将双变量转换为十进制
【发布时间】:2011-08-25 19:35:19
【问题描述】:

如何将double 转换为decimal,这是在进行货币开发时使用的。 M 去哪儿了?

decimal dtot = (decimal)(doubleTotal);

【问题讨论】:

    标签: c# casting decimal currency


    【解决方案1】:

    你只使用 M 作为数字文字,当你转换它时:

    decimal dtot = (decimal)doubleTotal;
    

    请注意,浮点数不适合保持精确值,因此如果先将数字相加然后转换为Decimal,可能会出现舍入错误。您可能需要先将这些数字转换为 Decimal,然后再将它们相加,或者首先确保这些数字不是浮点数。

    【讨论】:

    • 作为后续问题,为什么需要显式转换?我已经尝试过了,我收到一个错误,即不能将双精度数显式转换为小数,但小数不是更精确吗? (即很像从 int 转换为 double 可以是隐式的。)
    • @Cortana:小数的精度更高,但范围更小。双精度值可能超出小数范围。见:stackoverflow.com/questions/7817866/…
    【解决方案2】:

    使用默认转换类:Convert.ToDecimal(Double)

    【讨论】:

    • 否,因为它会抛出一个溢出异常 double vol_y = (double)Decimal.MaxValue + 10E+28D; Console.WriteLine("Convert.ToDecimal(vol_y) = " + Convert.ToDecimal(vol_y));
    • @ToXinE 恕我直言,在大多数情况下,OverflowException 比默默地创建错误数据要好
    【解决方案3】:

    您可以像这样将 double 转换为小数,而无需 M 文字后缀:

    double dbl = 1.2345D;
    decimal dec = (decimal) dbl;
    

    在声明新的文字十进制值时,您应该使用M

    decimal dec = 123.45M;
    

    (如果没有M,123.45 将被视为双精度,不会编译。)

    【讨论】:

      【解决方案4】:
      Convert.ToDecimal(the double you are trying to convert);
      

      【讨论】:

      • 我了解到 Convert 类比 C# 中的强制转换更加灵活和安全。
      • “安全”?当它无法转换时,它会在运行时抛出异常而不是编译器错误?我已经被它咬了很多次,以至于我积极地避免转换......
      • @PeterRitchie 线程有点旧,但应该说:直接调用 Convert 方法将是更合适的方法。也许我只是一个优化狂,但少一条指令来解决是一个好处(因为使用显式(类型)强制转换语法只是调用转换的运算符重载)。
      • @PeterRitchie:从语言设计的角度来看,最好要求程序员使用两种转换方法中的一种,而不是允许从doubledecimal 的类型转换,因为对于像 (1000000.0/3.0) 这样的double 值,在某些情况下,人们会想要剪裁“超额”精度,从而产生 333333.333333333D,但在其他情况下,人们会想要保留它,从而产生 333333.333333333313931D。而不是简单地说“转换为十进制”,代码应该指定应该如何执行转换。
      • @supercat 这似乎与我的第一条评论无关,因为使用Convert.ToDecimal(double)(decimal)doubleTotal 相同,除非doubleTotal 更改为其他类型,否则您可能会避免编译时错误并引入更难发现的运行时错误,因为可能会调用 不同的 ToDecimal 覆盖。 Cast 运算符更加明确...
      【解决方案5】:

      嗯,这是一个老问题,我确实利用了这里显示的一些答案。尽管如此,在我的特定场景中,我想要转换为 decimaldouble 值可能通常大于 decimal.MaxValue。所以,我没有处理异常,而是编写了这个扩展方法:

          public static decimal ToDecimal(this double @double) => 
              @double > (double) decimal.MaxValue ? decimal.MaxValue : (decimal) @double;
      

      如果您不想费心处理溢出异常,并且如果发生这种情况,您只想保持最大可能值(我的情况),则上述方法有效,但我知道对于许多其他情况,这不会是预期的行为,可能需要异常处理。

      【讨论】:

      • 在以下情况下会失败 double _double = (double)decimal.MaxValue;我建议在比较中使用 >= public static decimal ToDecimal(this double _double) => _double >= (double) decimal.MaxValue ? decimal.MaxValue : (十进制) _double;
      猜你喜欢
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 2012-11-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-10
      • 1970-01-01
      相关资源
      最近更新 更多