为啥我在从 MS Access 数据库中提取的十进制值中添加了零?

Posted

技术标签:

【中文标题】为啥我在从 MS Access 数据库中提取的十进制值中添加了零?【英文标题】:Why is that I get zeroes added to decimal values that I am pulling from MS Access database?为什么我在从 MS Access 数据库中提取的十进制值中添加了零? 【发布时间】:2012-01-17 16:41:47 【问题描述】:

我本来是问这个here,但不得不单独问。

为什么我从数据库中得到像 2.01000000 这样的值,即使我只存储十进制 2.01?在我的数据库中,我将其视为 2.01 而不是 2.010000。 MS Access 中的字段是十进制类型,我将其存储为 2.01 本身。我正在拉这样的价值:

 while(reader.Read())
        Convert.ToDecimal(reader[i]);

我得到的值为 2.010000000。为什么?有没有更好的方法从数据库中读取十进制值?我将字段的精度设置为 28,比例因子设置为 18..

【问题讨论】:

嗯。我原以为它会是 2.010000000000000000,其中的零比 2.01000000 多。生活和学习... reader[i] 的原始值是多少?它是一个字符串吗?如果有,它有额外的数据吗? @JaredPar reader[i] 是一个对象 @JonHanna 确实是这样。我只是展示了一些价值。 @nawfal 对,但它的运行时类型是什么? 【参考方案1】:

System.Decimal 在内部对精度敏感这一事实有关,SQL 的 decimal 更是如此 - 将它指定为类型的一部分。

18 位和 28 位精度意味着数据库中小数点后将有 18 位有效数字。 (共28位精度,点后18位,前10位)。

哪些访问恰好包含在它发送到 DAO 代码的表示中。

在解析完成时恰好记下小数。

因此你可以看到这个。

我个人认为这是一个缺陷;小数点应该将精度表示为显式属性,或者应该隐藏它。也许有一些我想不出的理由,但没有想到。

【讨论】:

【参考方案2】:

十进制按设计存储这些额外的零。您可以通过将数字四舍五入到正确的精度来设置所需的精度级别:

myNumber = decimal.Round(myNumber, 2);

这会将小数精度更改为 2 的精度(并应用舍入)。

【讨论】:

但是我怎么知道我应该设置什么精度呢?有时我的值是 2.01,有时是 2.0000001。如何处理这个 任何小数比较仍然有效,2.010000 将等于 2.01。它是否包含任何数量的零都不是问题。十进制值甚至会占用相同数量的内存存储空间。如果要将值转换为字符串,则只需执行 Trim('0')。

以上是关于为啥我在从 MS Access 数据库中提取的十进制值中添加了零?的主要内容,如果未能解决你的问题,请参考以下文章

如何从同一数据库的 VBA 代码中的 MS ACCESS 中提取字段

在从 MS Access 数据库获取 Long 后使用 OleDbDataReader.GetInt64() 时出现 System.InvalidCastException

MS Access - 为啥我得到空白表格

使用 Python 从 MS Access 中提取数据

MS-Access - 自动提取表的最简单方法

从 MS Access 数据库中提取源代码