为啥我在从 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