`
trophy
  • 浏览: 178659 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

oracle float(b)(转)

阅读更多

今天有人问我,他把字段类型设计成float(2)后,插入数据93.5,后,为什么变成了90?

为了说明这个问题,我们先来看一段话(http://www.cnoug.org/viewthread.php?tid=56643):Oracle Online Help 说:FLOAT(b) specifies a floating-point number with binary precision b. The precision b can range from 1 to 126. To convert from binary to decimal precision, multiply b by 0.30103。

根据这段话,我们可以看到,float(2)中的2是一个binary precision,而不是我们常用的decimal precision。他们之间的换算关系是:binary precision=int(b*0.30103),因此我们这里实际上的精度应该等于int(2*0.30103)=0,即小数点后精度为0。


回到我们原来的问题,93.5化成浮点型9.35*10^1,这时9.35小数点后精度为0,成9,因此最后变成9*10^1=90。

类似的,我们可以设计成float(10),那么int(10*0.30103)=3,因此,如果插入93.5,就得出9.35--精度为3-->9.350,9.350*10^1=93.5。如果插入13884.2,得出1.38842--精度为3-->1.388,1.388*10^4=13880。

我们可以从以下测试更加清楚的看到这样的换算规则。

Connected to Oracle9i Enterprise Edition Release 9.0.1.1.1 
Connected as aspire

SQL> 
SQL> CREATE TABLE hjm_float_test
2 (a FLOAT(2),
3 b FLOAT(10),
4 c FLOAT,
5 d NUMBER);

Table created

SQL> INSERT INTO hjm_float_test(a,b,c,d) VALUES(93.5,93.5,93.5,93.5);

1 row inserted

SQL> INSERT INTO hjm_float_test(a,b,c,d) VALUES(93.665,93.665,93.665,93.665);

1 row inserted

SQL> INSERT INTO hjm_float_test(a,b,c,d) VALUES(96.5,96.5,96.5,96.5);

1 row inserted

SQL> INSERT INTO hjm_float_test(a,b,c,d) VALUES(13884.2,13884.2,13884.2,13884.2);

1 row inserted

SQL> COMMIT;

Commit complete

SQL> SELECT * FROM hjm_float_test;

A B C D
---- ------------ -------------------------------------------------------------------------------- ----------
90 93.5 93.5 93.5
90 93.67 93.665 93.665
100 96.5 96.5 96.5
1000 13880 13884.2 13884.2

SQL> desc hjm_float_test;
Name Type Nullable Default Comments 
---- ------ -------- ------- -------- 
A FLOAT Y 
B FLOAT Y 
C FLOAT Y 
D NUMBER Y

SQL>

请特别注意的是,虽然我在设计表的时候设计成了float(2)、float(10),但是当我在desc表(代码最后7列)的时候却是看不到这样的设计结构的,这样的问题需要尤其引起注意!!

最后,让我们回顾一下,记住float(b)中的b是二进制的精度,他的换算规则是binary precision=int(b*0.30103)。

分享到:
评论

相关推荐

    oracle转mysql.rar

    索引方面,Oracle支持函数索引、位图索引等,而MySQL主要使用B-Tree索引,但在5.7及以上版本中引入了InnoDB的函数索引。在处理大量数据时,理解这些差异对优化查询性能至关重要。 视图和表连接也是两个数据库系统的...

    从oracle生成表的数据字典方法

    'FLOAT', 'FLOAT', 'NUMBER', CASE WHEN (b.DATA_LENGTH = 22 AND b.DATA_SCALE = 0) THEN 'INTEGER' ELSE 'NUMBER(' || b.DATA_LENGTH || ',' || b.DATA_SCALE || ')' END, 'RAW', 'RAW(' || b.DATA_LENGTH ...

    SQLSERVER到ORACLE的数据库迁移

    // B. 创建新数据库连接 con = DriverManager.getConnection(getConnectionUrl(), userName, password); // C. 从源SQL Server数据库读取数据 Statement stmt = con.createStatement(); ResultSet rs = stmt....

    SYBASE iq与ORACLE使用分析函数计算同期值及常用计算函数使用

    SYBASE iq中可以使用SELECT语句来计算同期值,例如:SELECT A.ID,A.CALC_MONTH,A.NUM,B.TQ_NUM FROM (SELECT A.ID,A.CALC_MONTH,NUM FROM) A LEFT JOIN (SELECT B.ID,B.CALC_MONTH,TQ_NUM FROM) B ON A.ID=B.ID AND ...

    oracle数字格式

    通过`TO_CHAR`函数,用户能够将数字(`NUMBER`, `BINARY_FLOAT`, 或者 `BINARY_DOUBLE`类型)转换为`VARCHAR2`类型的字符串,并按照预定义的格式展示出来。下面我们将详细介绍`TO_CHAR`函数中的各种格式化符号及其...

    oracle官方文档chm合集-sql参考手册

    4. **索引**:Oracle SQL支持多种类型的索引,包括B树索引、位图索引和函数索引。索引可以显著提高查询性能,但也需要考虑维护和空间占用。 5. **视图**:视图是虚拟表,由一个或多个表的查询结果组成。它们可以...

    Oracle SQLServer行列转换

    FROM dbo.[Scores] A JOIN [Student] B ON (A.StuNo = B.ID) GROUP BY StuName ORDER BY StuName ASC; ``` ##### 3. 使用 `PIVOT` 实现行转列 `PIVOT`操作提供了一种更简洁的方法来实现行转列,尤其是在字段...

    Oracle常用傻瓜問題1000問part1

    1. **数据类型**:Oracle支持多种数据类型,如CHAR、VARCHAR2、NUMBER、DATE、BINARY_FLOAT、BINARY_DOUBLE等。了解并正确使用这些数据类型对于存储和处理数据至关重要。 2. **SQL语句**:SQL是查询和管理Oracle...

    OCP/OCA认证考试指南全册:Oracle Database 11g(1Z0-051,1Z0-052,1Z0-053)

    - **数字类型**:如NUMBER和BINARY_FLOAT/BINARY_DOUBLE。 - **字符类型**:如VARCHAR2、CHAR和CLOB。 - **日期/时间类型**:如DATE和TIMESTAMP。 4. **索引和约束** - **索引类型**:包括B-tree、位图和反向键...

    ORACLE第六章.pptx

    Oracle支持多种类型的索引,如B树索引、位图索引、函数索引等。创建索引的基本语法是:`CREATE INDEX index_name ON table_name (column_name);` 接下来,**表空间**是Oracle数据库的逻辑存储单位,它将物理文件与...

    Oracle模式对象基础教案.pptx

    9.2.1 创建表时,可以定义多种数据类型,如字符类型(CHAR、VARCHAR2、NCHAR、NVARCHAR2、LONG)、数字类型(NUMBER、BINARY_FLOAT、BINARY_DOUBLE)、日期类型(DATE、TIMESTAMP、TIMESTAMP WITH TIME ZONE)以及...

    Oracle常用命令

    - **数字型**: NUMBER, INTEGER, FLOAT等。 - **日期类型**: DATE, TIMESTAMP等。 - **图片**: BLOB (Binary Large Object)。 **3. 创建表的案例** - **命令**: `create table tname (col1 type1, col2 type2, ......

    oracle_all_function.zip_Oracle数据库_SQL_

    2. **数据类型**:Oracle支持多种数据类型,如NUMBER、VARCHAR2、DATE、BINARY_FLOAT等,理解这些类型及其用途是数据库设计的基础。 3. **函数**:Oracle提供了一系列内置函数,如数学函数(如SQRT、MOD)、字符串...

    最新oracle图书系统.docx

    price FLOAT, storenum INT, pub VARCHAR(50), pubday VARCHAR(15) ); ``` - **读者表(Reader)**:记录读者信息,如读者编号、姓名、性别、类别、借阅次数限制、所在部门和联系电话等。 - SQL创建语句示例:...

    足球联赛信息管理系统(Oracle数据库实验报告)

    - teamB | Varchar2(10) | 外键,乙方球队编号 - aid | Varchar2(10) | 外键,场地编号 - **触发器表(LogTable)** - 字段名称 | 数据类型 | 说明 - lid | Varchar2(10) | 主键 - ltime | Date | 操作时间 -...

    Oracle数据库SQL及常用函数命令简介

    - 索引使用树形结构(如B树)来加速数据检索。通过索引,可以快速定位到所需的数据行,从而提高查询效率。 #### 十八、存在测试 (EXISTS 和 NOT EXISTS) - `EXISTS` 和 `NOT EXISTS` 用于测试子查询是否返回至少一...

    C程序设计答案

    14. **逻辑运算**:在条件语句中,`if(a<b) if(b) ...`可以理解为逻辑AND操作,只有当a小于b且b小于c时,才会执行后续代码。 15. **关系运算符**:`、`>`、`==`等用于比较操作,如`if(max<b)`中的`表示小于。 16. ...

    麻省理工18年春软件构造课程阅读02-Java基础-1

    Java是一种广泛使用的面向对象的编程语言,由Sun Microsystems开发,后被甲骨文公司(Oracle)收购。Java的设计理念是“一次编写,到处运行”,它通过Java虚拟机(JVM)实现跨平台兼容性。本节主要讨论Java与Python...

Global site tag (gtag.js) - Google Analytics