2012-01-17 37 views
1

我原本问这个here,但不得不单独询问。为什么我将零点添加到我从MS Access数据库中提取的十进制值?

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

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

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

+0

嗯。我原以为它会是2.010000000000000000的方式更多的零比2.01000000。生活和学习...... – 2012-01-17 16:49:18

+0

您在'reader [i]'中获得的原始价值是多少?它是一个字符串吗?如果是这样,它有额外的数据? – JaredPar 2012-01-17 16:52:00

+0

@JaredPar阅读器[i]是一个对象 – nawfal 2012-01-17 16:56:15

回答

2

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

18的缩放比例和28的精度意味着数据库中小数点后面会有18位有效数字。 (28位精度总数,18点后,离开10点)。

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

并且在解析完成时注意到十进制。

因此,你可以看到这一点。

就我个人而言,我认为这是一个缺陷;任何一位小数都应该表示精度作为显式属性,否则应该隐藏它。也许有一些我无法想到的理由,但没有想到。

0

小数点按设计存储这些额外的零。您可以通过四舍五入数到正确的精度可能设置你想要的精确度水平:

myNumber = decimal.Round(myNumber, 2); 

这将小数精度改为精度为2(和应用四舍五入)。

+0

但是我怎么知道我应该设置什么精度?我有时有2.01的值,有时2.0000001。如何处理这个 – nawfal 2012-01-17 17:03:36

+0

小数的任何比较仍然有效,2.010000将等于2.01。它是否包含任何数量的零不是问题。十进制值甚至会在内存中占用相同的存储量。如果您将值转换为字符串,则只需执行修剪('0')。 – 2012-01-18 08:41:02

相关问题