Oracle十进制转浮点数机制及FLOAT(5)列舍入异常问题问询
Oracle浮点数转换与舍入问题解答
1. Oracle如何将十进制数值转换为浮点数?
Oracle处理十进制到浮点数的转换流程如下:
- 先将十进制数转换为二进制表示:整数部分通过除2取余、逆序排列得到二进制整数;小数部分通过乘2取整、顺序排列得到二进制小数。
- 再根据
FLOAT(n)定义的n(二进制有效数字的最大位数),从二进制数最高位的第一个1开始,保留前n位有效数字,对后续位数执行二进制舍入(0舍1入,若舍入位为1且后续存在非0位则进1)。 - 最后将舍入后的二进制数转回十进制,作为最终存储和显示的结果。
2. 为什么FLOAT(5)列中7.89舍入为7.9,12.79舍入为13而非12.8?
Oracle中FLOAT(n)的n代表二进制有效数字的位数,5位二进制有效数字对应的十进制有效精度约为 5 × log₁₀(2) ≈ 1.5,实际会按2位十进制有效数字进行舍入:
- 7.89的两位有效数字是7和8,第三位是9,满足进1条件,8进1变为9,结果为7.9。
- 12.79的两位有效数字是1和2,第三位是7,满足进1条件,2进1变为3,因此结果是13——12.8属于三位有效数字,超出了
FLOAT(5)的精度范围,不会被保留。 - 1.23的两位有效数字是1和2,第三位是3,直接舍去,结果为1.2。
示例二进制形式
7.89 0111.01011001 ------ round to------> 7.9 0111.01001 12.79 01100.01001111 ------ round to------> 12.8 01100.1 1.23 1.010111 ------ round to------> 1.2 1.1
测试代码与结果
CREATE TABLE t1 ( item FLOAT(5) ); INSERT INTO t1 VALUES ( 7.89 ); INSERT INTO t1 VALUES ( 12.79 ); INSERT INTO t1 VALUES ( 1.23 ); SELECT ITEM FROM T1; ITEM ---- 7.9 13 1.2
内容的提问来源于stack exchange,提问作者titi zarif
相关产品推荐
相关产品推荐

