当编译器看到一个数字文字时,它会根据数字的大小、标点符号和后缀(如果有的话)选择一种类型,然后将其中的字符序列转换为该类型;所有这一切都是在不考虑编译器将如何处理数字的情况下完成的。一旦完成,编译器将只允许将数字用作自己的类型,显式转换为另一种类型,或者在下面定义的两种情况下隐式转换为另一种类型。
如果数字被解释为任何整数类型(int
,long
等),编译器将允许它用于初始化数字可表示的任何整数类型,以及任何二进制或十进制浮点类型,而不考虑数字是否可以在该类型中精确表示。
如果数字是类型Single
[由f
后缀表示],编译器将允许它用于初始化 a Double
,而不考虑结果Double
是否准确表示初始化 a 的文字Single
。
Double
[包括小数点,但没有后缀] 或Decimal
[后缀“D” 后缀不紧跟加号或减号] 的数字字面量不能用于初始化任何其他变量,即使该数字可以精确表示在目标类型中,或者结果将是目标类型对相关数字文字的最佳表示。
请注意,应尽可能避免类型Decimal
和其他浮点类型(double
和)之间的转换,因为转换方法不是很准确。float
虽然有许多double
值不存在精确Decimal
表示,但存在一个宽泛的数值范围,其中Decimal
值比值更紧密地打包double
。人们可能期望转换 adouble
会选择最接近的Decimal
值,或至少一个Decimal
介于该数字和下一个更高或更低double
值之间的值,但正常的转换方法并不总是这样做。在某些情况下,结果可能相差很大。
如果您发现自己必须转换Double
为Decimal
,那么您可能做错了什么。虽然有一些可用的操作在 上Double
不可用Decimal
,但在这两种类型之间进行转换的行为意味着Decimal
您最终得到的任何结果都往往不如所有计算都在 Double` 中完成。