C#转换为十进制数

13

什么是它们之间的区别(如果有的话)?

decimal d = (decimal) myDouble;
decimal d = new decimal(myDouble);
decimal d = Convert.ToDecimal(myDouble);
3个回答

10

没有区别。如果您查看源代码:

十进制:

public static explicit operator decimal(double value)
{
    return new decimal(value);
}    
在转换中:
public static decimal ToDecimal(float value)
{
    return (decimal) value;
}

所以最终他们都会调用 new decimal(double)


但是(decimal)valuenew decimal(value)之间可能存在差异:第一个调用内置的double-to-decimal转换运算符,而第二个调用decimal构造函数的重载。尽管本地代码可能相同,但IL可能不同,而C#语义肯定不同。 - phoog
2
@phoog 两者之间没有区别。没有“内置”的双精度到十进制转换运算符,答案中提供的第一种方法就是被调用的方法。你提供的第一种方式只是在调用树中调用了你提供的第二种方式的一个方法。 - JKor
@JKor 我没有提供任何方法;我只是在评论。 - phoog
1
@phoog,是的,您提供了(decimal)valuenew decimal(value) - JKor
@JKor 啊,抱歉,我误解了。无论如何,如果没有“内置”的双精度浮点数转十进制的方法,请解释一下这个IL:call valuetype [mscorlib]System.Decimal [mscorlib]System.Decimal::op_Explicit(float64)。构造函数示例编译为:call instance void [mscorlib]System.Decimal::.ctor(float64)。它们最终在运行时编译为不同的 internalcall 方法。 - phoog
但是如果你看一下,op_Explicit(float64)方法会调用构造函数,就像上面展示的那样。(public static explicit operator aType编译成一个名为op_Explicit(aType)的方法) - JKor

5
他们都能达到相同的结果。然而,以下是更详细的解释:
- 方法1:创建一个新变量,将myDouble显式转换为decimal类型。当你进行强制转换时,你是在说,“这个A类型的对象实际上是一个B派生自A的对象,或者存在一个强制转换运算符将A转换为B。” - 方法2:创建一个新变量,通过构造函数重载将myDouble转换为适当的类型(decimal)。当你调用构造函数时,你是在说,“基于传递给构造函数的参数创建一个新对象。” - 方法3:将一个基本数据类型(double)转换为另一个基本数据类型(decimal)。当你使用类似Convert.ToDecimal()的方法时,你是在说,“这个对象不是B类型,但是存在一种方法可以将它转换为B类型的对象。”
关于Convert,MSDN指出:
- 为每种基本类型之间的转换提供了一个转换方法。但是,实际执行的转换操作分为三类: - 将一个类型转换为自身仅返回该类型。实际上不执行任何转换。 - 不能产生有意义结果的转换会抛出InvalidCastException异常。从Char到Boolean、Single、Double、Decimal或DateTime以及从这些类型到Char的转换会抛出异常。从DateTime到除String以外的任何类型的转换以及从任何类型(除String以外)到DateTime的转换都会抛出异常。除上述类型外的任何基本类型都可以相互转换。

示例2展示了一个构造函数重载。另外,示例1中的类型转换示例根据您的定义并不是一种类型转换,因为当然decimal不是从double派生的(反之亦然)。相反,C#强制转换运算符具有两个功能:(1)保留表示形式的引用类型转换和(2)调用内置或用户定义的显式(或隐式)转换。 - phoog

3

从功能角度来看,实际上没有任何区别。这些都是实现相同结果的不同方法。

需要注意的是,在Convert.ToDecimal的情况下,您可以指定IFormatProvider(culture)格式,因此您可以获得更多的灵活性。

如果您不关心多文化环境,请选择您喜欢的任何一种方法。


1
我想这里忽略了IFormatProvider,因为输入和输出都不是字符串。 - phoog
是的,正确的。这个注释是关于可能存在的一般使用差异的。 - Tigran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接