1

请原谅我,我没有经常使用这个网站!我正在使用 Visual Basic 在 Visual Studio 中工作。我用 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)

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

有人能告诉我为什么会这样吗?非常感谢!

4

2 回答 2

1

Double 是 8 个字节,Decimal 是 16 个字节。Option Strict 防止自动类型转换。默认情况下,如果您在 VB.NET 中编写带小数的数字,则它被视为双精度数而不是十进制数。为了说小数,你必须使用一些字符来指定(我的小数是 m)所以如果你声明

Const VAR as decimal = 0.07m

那么你就不需要铸造了。

于 2013-05-02T13:01:59.340 回答
0

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

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

如果数字是类型Single[由f后缀表示],编译器将允许它用于初始化 a Double,而不考虑结果Double是否准确表示初始化 a 的文字Single

Double[包括小数点,但没有后缀] 或Decimal[后缀“D” 后缀不紧跟加号或减号] 的数字字面量不能用于初始化任何其他变量,即使该数字可以精确表示在目标类型中,或者结果将是目标类型对相关数字文字的最佳表示。

请注意,应尽可能避免类型Decimal和其他浮点类型(double和)之间的转换,因为转换方法不是很准确。float虽然有许多double值不存在精确Decimal表示,但存在一个宽泛的数值范围,其中Decimal值比值更紧密地打包double。人们可能期望转换 adouble会选择最接近的Decimal值,或至少一个Decimal介于该数字和下一个更高或更低double值之间的值,但正常的转换方法并不总是这样做。在某些情况下,结果可能相差很大。

如果您发现自己必须转换DoubleDecimal,那么您可能做错了什么。虽然有一些可用的操作在 上Double不可用Decimal,但在这两种类型之间进行转换的行为意味着Decimal您最终得到的任何结果都往往不如所有计算都在 Double` 中完成。

于 2013-08-18T00:02:19.470 回答