2013-05-02 15 views
1

请原谅我,我没有使用过这个网站非常多!我在Visual Studio中使用Visual Basic工作。我完成了选项编程我的项目严格关闭,然后当我打开选项时,我被提醒,这个代码是错误的严格:Option Visual Basic中的严格On和常量?

Const TAX_Decimal As Decimal = 0.07 

的解释是,“选项严格On不允许从‘双师型’到隐式转换“小数””

但我想我已经宣布它作为一个小数!这让我将其更改为:

Const TAX_Decimal As Decimal = CDec(0.07) 

我这个常量做的唯一的事情就是用它乘小数并将其保存到声明为小数变量!

有人能告诉我,为什么发生这种情况?非常感谢你!

回答

1

双人是8个字节,十进制是16个字节。选项严格防止自动类型转换。默认情况下,如果您在VB.NET中使用小数写入数字,则它被认为是double而不是decimal。对于说您小数必须使用一些字符来指定(我的事情十进制为m),所以如果你声明

Const VAR as decimal = 0.07m 

那么你不会需要铸造。

+0

好吧!谢谢你的澄清。 – user1691432 2013-05-02 22:16:31

+0

这已经回答了你的问题?如果是这样标记出。谢谢 – Guanxi 2013-05-04 13:03:38

0

当编译器看到数字文字,它选择根据数字,标点符号和后缀(如果有的话)的大小的类型,然后在转换它到该类型的字符的序列;所有这些都是在不考虑编译器将如何处理数字的情况下完成的。一旦完成,编译器将只允许将该数字用作其自己的类型,明确地将其转换为另一种类型,或者在下面定义的两种情况下隐式转换为另一种类型。

如果号码被解释为任何整数类型(intlong等),编译器将允许它被用来初始化,其中数可表示任何整数类型,以及任何二进制或十进制浮点而不考虑数字是否可以在该类型中精确表示。

如果号码键入Single [由f后缀表示],编译器将允许它被用来初始化一个Double,而不对所得Double是否准确地表示与该Single初始化的字面方面。

Double类型的数字文本[包括一个小数点,但没有后缀]或Decimal [一个“d”为后缀不是通过加上或减去接着立即]不能用于初始化任何其它的变量,即使该数字可以在目标类型中精确表示,或者结果将成为目标类型对所涉及的数字文字的最佳表示。

注意Decimal类型和其他浮点类型(doublefloat)之间转换,应尽可能避免,因为转换的方法不是非常精确。虽然有许多对于没有确切Decimal表示存在double值,有一个宽数值范围,其中Decimal值更紧密包装的比double值。人们可能会预期,转换double会选择最接近的Decimal值或至少一个Decimal值,该值介于该值与下一个更高或更低的double值之间,但常规转换方法并不总是如此。在某些情况下,结果可以通过显著保证金被关闭。

如果您发现自己必须将Double转换为Decimal,那么您可能是在做错某些事情。虽然有一些操作可在Double不可用的Decimal,这两种类型之间进行转换的行为意味着什么Decimal结果你最终趋于变比,如果所有的计算都在Double`已经做不太精确。