有关Oracle的Number类型与C#数据类型的对应关系

我们一般会如下定义:NUMBER ( precision, scale)

1.precision表示最大的有效位数,表示从最左边不为零的第一位数算起,不计算小数点和负号,最大的数字位数。如果定义时不指定,那么默认为38。取值范围为1到38。

2.scale表示精确到多少位,指根据正负号确定精确到小数点左边或右边多少位,默认为零。取值范围是-84到127。如果存入的数字小数点后的数字个数大于这个scale,那么后面的数字将会进行舍去。scale为负数,表示对小数点左边的scale个数字转换为零。

3.定义好后,该字段允许存放数据的整数部分数字位数为 precision-scale。如果scale为负数,也是一样计算。如果precision-scale算出来为负数,precision表示小数点后第scale位向左最多可以有多少位数字,如果大于precision则会报错,小数点后scale位向右的数字被舍入。

4.我使用C#编写程序,并实现了一个小型的ORM,是将数据取出后直接放置在DataTable中,然后再将DataTable中的记录行转换成实体对象。但定义实体对象时, 发现数据类型的映射经常有问题,于是仔细研究了一下,结论如下

Stytem.Int16是16位的整数,值的范围-32768~+32767,那么number(1)到number(4)用Stytem.Int16表示是安全的。

Stytem.Int32是32位的整数,值的范围-2147483648~2147483647,那么number(5)到number(9) 用Stytem.Int32表示是安全的。

Stytem.Int64是64位的整数,值的范围-9223372036854775808~9223372036854775807,那么number(10)到number(18) 用Stytem.Int64表示是安全的。

number(19)到number(38)则需要用Stytem.Decimal,注意如果数据库中存储的数据大于Stytem.Decimal所能表达的最大值,取值时会抛出异常。

Stytem.Single是32位的浮点数,其存储格式为sign(1bit)+exponent(8)+fraction(23)。由于存放fraction部分是省去了最高位的1,那么2的24次方为16777216,8位数,那么对于precision不超过7的情况,都是可以用System.Single来存放的。

Stytem.Double是64位的双精度浮点数,其存储格式为sign(1bit)+exponent(11)+fraction(52)。由于存放fraction部分是省去了最高位的1,那么2的53次方为9007199254740992,16位数,那么对于precision不超过15的情况,都是可以用System.Double来存放的。

对于precision大于等于16的情况,则只能采用System.Decimal来存放。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值