【问题标题】: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 对,但它的运行时类型是什么?

标签: c# ms-access decimal datareader


【解决方案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')。
    猜你喜欢
    • 2012-02-08
    • 2014-02-18
    • 1970-01-01
    • 2016-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-08
    • 2019-08-20
    相关资源
    最近更新 更多