请原谅我,我没有非常使用过这个网站!我在Visual Studio中使用Visual Basic。我用Option Strict Off完成了我的项目编程,然后当我打开Option Strict时,我被警告这段代码错了:
Const TAX_Decimal As Decimal = 0.07
解释是“Option Strict On禁止从'Double'到'Decimal'的隐式转换”
但我以为我已经宣布它为小数!它让我改为:
Const TAX_Decimal As Decimal = CDec(0.07)
我对这个常量做的唯一一件事就是将它乘以一个小数并将其保存到一个声明为十进制的变量中!
有人能告诉我为什么会这样吗?非常感谢你!
答案 0 :(得分:1)
Double是8个字节,Decimal是16个字节。选项严格阻止自动类型转换。默认情况下,如果在VB.NET中写入带小数的数字,则认为它是double而不是decimal。为了说十进制,你必须使用一些字符来指定(我对十进制的东西是m)所以如果你声明
Const VAR as decimal = 0.07m
然后你不需要施法。
答案 1 :(得分:0)
当编译器看到数字文字时,它会根据数字大小,标点符号和后缀(如果有的话)选择一个类型,然后将其中的字符序列转换为该类型;所有这些都是在不考虑编译器将如何处理数字的情况下完成的。完成此操作后,编译器将仅允许将该数字用作其自己的类型,显式转换为其他类型,或者在下面定义的两种情况下隐式转换为另一种类型。
如果数字被解释为任何整数类型(int
,long
等),编译器将允许它用于初始化数字可表示的任何整数类型,以及作为任何二进制或十进制浮点类型,不考虑该数字是否可以在该类型中精确表示。
如果数字是Single
类型[由f
后缀表示],编译器将允许它用于初始化Double
,而不考虑结果Double
1}}将准确地表示Single
初始化的文字。
Double
类型的数字文字[包括小数点,但没有后缀]或Decimal
[a“D”后缀后面没有加号或减号]不能用于初始化任何其他变量,即使数字可以在目标类型中精确表示,或者结果将是目标类型对所讨论的数字文字的最佳表示。
请注意,应尽可能避免类型Decimal
与其他浮点类型(double
和float
)之间的转换,因为转换方法不是很准确。虽然有许多double
值不存在精确的Decimal
表示,但有一个宽的数值范围,其中Decimal
值比double
值更紧密。有人可能会认为转换double
会选择最接近的Decimal
值,或者至少有一个Decimal
值,这些值介于该数字与下一个更高或更低double
之间值,但正常的转换方法并不总是如此。在某些情况下,结果可能会大幅减少。
如果您发现自己必须将Double
转换为Decimal
,那么您可能做错了什么。虽然Double
上有一些Decimal
无法使用的操作,但这两种类型之间的转换操作意味着您最终得到的Decimal
结果可能会更少比所有计算都是在Double`中完成的那样精确。