Oracle number类型的语法和用法
摘要:先根据精度值,对number类型的数据从左边第一个非零数字开始数精度值个位数,之后的位数截断不要(要四舍五入吗),再根据小数位置值,对number类型的数据右边的低位进行四舍五入(如果小数位置值为负的,如何处理?)
摘要:先根据精度值,对number类型的数据从左边第一个非零数字开始数精度值个位数,之后的位数截断不要(要四舍五入吗),再根据小数位置值,对number类型的数据右边的低位进行四舍五入(如果小数位置值为负的,如何处理?)
number类型的语法很简单,就是:
number(p,s)
p,s都是可选的,假如都不填,p默认为38,s默认为-48~127。
1. 精度(precision),或总位数。默认情况下,精度为38位,取值范围是1~38之间。也可以用字符*表示38。
2. 小数位置(scale)
当s(scale)为正数时,Oracle就对小数点右边的s个数字进行舍入。精确到小数点右边s位,并四舍五入。然后检验有效数位是否<=p;如果s>p,小数点右边至少有s-p个0填充。
当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。精确到小数点左边s位,并四舍五入。然后检验有效数位是否<=p+|s|
小数位数的合法值为-48~127,其默认值取决于是否指定了精度:
如果没有知道精度,则小数位数的取值默认可以落在最大的取值区间,即-48~127【Oracle 11g r2上,不只为127,但貌似小于140】上。
如果指定了精度,且指定了小数位数为n,则小数位数的取值可以落在取值区间0~n上。
如果指定了精度,而没有写出小数位数,则小数位数默认为0(小数点右边一位都没有)。
例如,定义为NUMBER的列会存储浮点数(有小数),而NUMBER(38)只存储整数数据(没有小数),因为在第二种情况下小数位数默认为0.
当s(scale)为正数时,Oracle就对小数点右边的s个数字进行舍入。精确到小数点右边s位,并四舍五入。然后检验有效数位是否<=p;
当s(scale)为负数时,Oracle就对小数点左边的s个数字进行舍入。精确到小数点左边s位,并四舍五入。然后检验有效数位是否<=p+|s|
小数位数的合法值为-48~127,其默认值取决于是否指定了精度:
如果没有知道精度,则小数位数的取值默认可以落在最大的取值区间,即-48~127【Oracle 11g r2上,不只为127,但貌似小于140】上。
如果指定了精度,且指定了小数位数为n,则小数位数的取值可以落在取值区间0~n上。
如果指定了精度,而没有写出小数位数,则小数位数默认为0(小数点右边一位都没有)。
例如,定义为NUMBER的列会存储浮点数(有小数),而NUMBER(38)只存储整数数据(没有小数),因为在第二种情况下小数位数默认为0.
注释:
1、
1、
对于number(p,s)格式的数值,该数值中的哪些位数算为精度值位数呢?
回答该问题,首先我们要确定第|s|位数字为是哪一位?
当刻度s为负数时,Oracle就对小数点左边开始向前数的第|s|位数字是第|s|位数字,并对该数字进行四舍五入。例如,对于数据类型为number(5,-3)的列,输入数值1267.9,则Oracle就会判断出数值1267.9的第|s|位数字为2,之后对该数字2进行四舍五入,由于2小于5,所以第|s|位数字相邻左边一个数字1不变没有增一,而(四舍五入后)从第|s|位数字算起其右边的所有数字都置为