3

Some_Variable 具有从数据库返回的值 295523.93。[DataType:money(Transact-SQL数据类型。使用的数据库是SQL2005)]

  • (十进制)Some_Variable 给出值 = 295523.93 [数据类型:十进制]
  • (float)Some_Variable 给出值 = 295523.938 [DataType: float]
  • (decimal)((float)Some_Variable) 给出值 = 295523.9 [DataType: decimal]
  • Convert.ToDecimal((float)Some_Variable) 给出值 = 295523.9 [DataType: decimal] (
  • (decimal)((double)Some_Variable) 给出 value = 295523.93 [DataType: decimal]
  • Convert.ToDecimal((double)Some_Variable) 给出 value = 295523.93 [DataType: decimal]

为什么以下在极少数情况下会给出 295523.9(由于项目运行超过 2 年而出现一次)

  • Convert.ToDecimal((float)Some_Variable) 给出 value = 295523.9 [DataType: decimal]

我正在考虑使用(decimal)Some_Variable ,它给出 value = 295523.93,但是除了与数字如何存储在内存中(二进制)有关之外,是否还有其他解释?

[编辑]:虽然实际值来自数据库,但为了重现问题,我在下面的示例中直接为其分配了值。请在下面的代码屏幕截图和 Watch 窗口中找到。与监视窗口一起重现问题的代码片段

4

1 回答 1

3

float具有极小的精度(对应于大约 7-8 个十进制数字)。例如,这些是您范围内的后续浮点数:

01001000100100000100110001111101 --> 295523.90625
01001000100100000100110001111110 --> 295523.9375
01001000100100000100110001111111 --> 295523.96875

因此,例如,值295523.92将四舍五入为这些值中的第一个或第二个。由于第八位有效数字非常不准确,因此在转换为十进制时保留它是没有意义的。这种行为在(我强调)的文档中有所描述:Convert.ToDecimal(float)

此方法返回的 Decimal 值最多包含七个有效数字。如果 value 参数包含超过 7 个有效数字,则使用舍入到最接近的方式对其进行舍入。

295523.93有八位有效数字。使用“四舍五入”的收益率四舍五入到七位有效数字295523.9

于 2013-10-30T16:31:43.683 回答