C#将一个double变量转换为十进制

flo*_*flo 76 c# casting currency decimal

这对某些人来说似乎是一个愚蠢的问题,但我需要将一个双精度数转换成十进制来用作货币.M去哪儿了?

decimal dtot = (decimal)(doubleTotal);
Run Code Online (Sandbox Code Playgroud)

Guf*_*ffa 66

你只使用M数字文字,当你施展它时:

decimal dtot = (decimal)doubleTotal;
Run Code Online (Sandbox Code Playgroud)

请注意,浮点数不适合保留精确值,因此如果首先将数字相加然后转换为Decimal可能会出现舍入错误.您可能希望在将数字Decimal添加到一起之前将其转换为数字,或者确保数字首先不是浮点数.

  • @Cortana:小数点的精度较高,但范围较小。双精度值可能超出小数的范围。参见:http://stackoverflow.com/questions/7817866/why-cant-double-be-implicitly-cast-to-decimal (4认同)

Chr*_*tow 31

您可以像这样将double转换为十进制,而不需要M文字后缀:

double dbl = 1.2345D;
decimal dec = (decimal) dbl;
Run Code Online (Sandbox Code Playgroud)

您应该使用Mwhen声明一个新的文字十进制值:

decimal dec = 123.45M;
Run Code Online (Sandbox Code Playgroud)

(没有M,123.45被视为double,不会编译.)


Tim*_*kov 25

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

  • @ToXinE 恕我直言,在大多数情况下,OverflowException 比默默创建错误数据更好 (5认同)

Tom*_*Tom 14

Convert.ToDecimal(the double you are trying to convert);
Run Code Online (Sandbox Code Playgroud)

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