将双精度变量转换为十进制


94

在进行货币开发时,如何将其转换doubledecimal哪种。在什么地方M去?

decimal dtot = (decimal)(doubleTotal);

Answers:


83

您仅将M用作数字文字,而将其强制转换为:

decimal dtot = (decimal)doubleTotal;

请注意,浮点数不适合保留确切的值,因此,如果您先将数字相加然后转换为Decimal,则可能会舍入错误。您可能需要将数字转换为,Decimal然后再将它们加在一起,或者确保数字首先不是浮点数。


作为后续问题,为什么需要显式转换?我已经尝试过了,但收到一个错误,即不能将双精度数显式转换为小数,但是小数没有精度吗?(即,很像从int转换为double可能是隐式的。)

4
@Cortana:小数点的精度较高,但范围较小。双精度值可能超出小数的范围。请参阅:stackoverflow.com/questions/7817866/...
Guffa

40

您可以像这样将双精度数转换为十进制,而无需M字面量后缀:

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

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

decimal dec = 123.45M;

(如果没有M,则123.45将被视为double且将不会编译。)


28

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


1
否,因为它将引发OverflowException double vol_y =(double)Decimal.MaxValue + 10E + 28D; Console.WriteLine(“ Convert.ToDecimal(vol_y)=” + Convert.ToDecimal(vol_y));
ToXinE 2014年

2
@ToXinE恕我直言,在大多数情况下,OverflowException优于静默创建错误数据
this.myself

16
Convert.ToDecimal(the double you are trying to convert);

2
我了解到,Convert类比C#中的强制转换更加灵活和安全。
汤姆(Tom)

3
“安全”?如在无法强制转换时在运行时引发异常而不是编译器错误?我被那么多次咬伤,以至于我积极避免使用Convert ...
Peter Ritchie

8
@PeterRitchie线程有点旧,但是应该这样说:更直接的方法是直接调用Convert方法。也许我只是一个优化狂,但是要解决的一条少指令是一个好处(因为使用显式(类型)强制转换语法只是调用Convert的运算符重载)。
迈克·约翰逊

1
@PeterRitchie:从语言设计的角度来看,最好是要求程序员使用两种转换方法中的一种,而不是允许从doubleto 进行类型转换decimal,因为对于double(1000000.0 / 3.0)这样的值,在某些情况下会想要裁剪“多余的”精度以产生333333.333333333D,但在其他情况下,则希望保留它,从而获得333333.3333333333139139D。代码不应简单地说“转换为小数”,而应指定如何执行该转换。
2014年

2
@supercat的确与我的第一条评论无关,因为使用Convert.ToDecimal(double)方法与相同(decimal)doubleTotal,除非doubleTotal更改为其他类型,否则可能会避免编译时错误并引入难于发现的运行时错误,因为使用了不同的 ToDecimal覆盖可能会被调用。演员更明确...
Peter Ritchie 2014年

1

好吧,这是一个古老的问题,我确实利用了此处显示的一些答案。不过,在我的特定情况下double,我想要转换为的值可能decimal经常大于decimal.MaxValue。因此,我没有处理异常,而是编写了此扩展方法:

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

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


1
在以下情况下,这将失败double _double =(double)decimal.MaxValue; 我建议在比较公共静态十进制ToDecimal(this double _double)=> _double> =(double)decimal.MaxValue中使用> =。decimal.MaxValue:(十进制)_double;
马丁·艾尔斯
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.