关于float(b)类型数据类型的精度的学习

文章讨论了在Oracle数据库中,将字段类型设为float(2)后插入93.5导致数据变为90的原因。问题源于float类型的二进制精度(binaryprecision)并非十进制精度。float(2)的实际精度为0,无法保存小数部分,因此93.5被截断为90。文章通过示例展示了不同精度设置如何影响数值存储,并提供了转换公式binaryprecision=int(b*0.30103)。
摘要由CSDN通过智能技术生成

Questions: 将表中的某字段类型设计成float(2)后,向其插入数据93.5后,最好结果却变成了90?这是为什么?

关于这个问题 官方帮助文档(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.3509.350*10^1=93.5。如果插入13884.2,得出1.38842–精度为3–>1.388,1.388*10^4=13880。

SQL> 
SQL> show user;
USER is "SCOTT"
SQL> 
SQL> 
SQL> create table maxwell_float_test
  2  (a FLOAT(2),
  3  b FLOAT(10),
  4  c FLOAT,
  5  d NUMBER);

Table created.

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

1 row created.

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

1 row created.

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

1 row created.

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

1 row created.

SQL> commit;

Commit complete.

SQL> select * from maxwell_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
     10000      13880    13884.2    13884.2

SQL> set pagesize 200 linesize 200
SQL> desc maxwell_float_test;
 Name                                                                                                              Null?    Type
 ----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
 A                                                                                                                          FLOAT(2)
 B                                                                                                                          FLOAT(10)
 C                                                                                                                          FLOAT(126)
 D                                                                                                                          NUMBER

SQL> col name format a10
SQL> col type format a10
SQL> desc maxwell_float_test;
 Name                                                                                                              Null?    Type
 ----------------------------------------------------------------------------------------------------------------- -------- ----------------------------------------------------------------------------
 A                                                                                                                          FLOAT(2)
 B                                                                                                                          FLOAT(10)
 C                                                                                                                          FLOAT(126)
 D                                                                                                                          NUMBER

SQL>

请注意注意 float(b)中的b是二进制的精度,进行换算 binary precision=int(b*0.30103)

### 浮点数类型 `float` 和 `double` 的特性 #### 存储空间与精度 - **`float` 类型**:占用 4 字节(32位),提供大约7位有效数字的精度。适用于对精度要求不高且需要节省内存的情况[^1]。 - **`double` 类型**:占用 8 字节(64位),能表示约15到17位的有效数字,具有更高的精确度。当应用程序涉及到高精度计算时推荐使用此类型[^5]。 #### 数值范围 - 对于 `float` 而言,可表达的最大正有限值约为 \(3.4 \times 10^{38}\),最小正常化正值接近\(1.4\times10^{-45}\)。 - 关于 `double` ,最大正有限值可达\(1.8\times10^{308}\), 最小正常化的正值为\(4.9\times10^{-324}\)。 #### 使用场景 - 当开发人员处理图形渲染、游戏逻辑或其他不需要极高准确性的情境下可以选择 `float` 。因为这类应用通常更关注性能而非绝对精准的结果。 - 如果涉及金融交易、科学仿真等领域,则应优先考虑采用 `double` 来确保足够的数值稳定性和可靠性[^3]。 #### Java 中的具体实例 在编写程序时需要注意不同编程语言对于这两种类型的定义可能有所差异。例如,在Java里,默认情况下未指定的小数会被视为 `double` 类型;如果要声明一个 `float` 变量并赋初值的话,应当加上字母"f"作为后缀来表明该常量属于单精度浮点数: ```java // 正确的方式初始化 float 变量 float b = 2.5f; ``` 如果不这样做将会引发编译错误,因为在默认状态下像 "2.5" 这样的字面量被解释成 `double` , 并且无法隐式转换至较小尺寸的目标类型——即 `float` 。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值