-- Se tiene definida la siguiente tabla
CREATE TABLE MY_TABLA
(
ID NUMBER (3),
NUM_TAB FLOAT (3)
);
INSERT INTO MY_TABLA
VALUES (24, 24);
SELECT ID, NUM_TAB FROM MY_TABLA;
-- 24 20
```
- 如果它是发送的,为什么要
NUM_TAB
插入它?20
24
- 在什么情况下建议
FLOAT
默认更改字段的精度?
虽然不是很清楚,但解释在此处的文档中:FLOAT 数据类型。
当您使用 定义列时
FLOAT(n)
,您可能已经注意到,n
它不会以小数位数表示精度,NUMBER(n)
例如类型。相反,它n
表示位数的精度。即使这并不完全正确,最完整的解释要复杂得多。如果您想在我的简单解释之外更深入地了解该主题,您可以在此答案中找到更多详细信息。理解该值的一种粗略方法
n
是,对于您设置为 type 的每 3 位(给或取)FLOAT
,这会给您多一位允许的精度。一个简单的公式,但它只是一个近似值:这是因为在指定
3
位精度 (FLOAT(3)
) 时,这实际上相当于一位精度 (1 = (3 / 3) + 1
)。为了表达24
,您需要至少 2 位精度,因此您必须声明FLOAT(n)
值n
至少为的类型4
。现在,要了解为什么将值替换为
24
,20
您首先需要了解,当我们谈论精度数字时,我们实际上是在谈论类型时的有效数字。也就是说,当我们说它相当于一位数的精度时,并不是说只能表达-9到9之间的数字,而是说,无论表达什么值,都只能包含一个最大值1 位有效数字。FLOAT
FLOAT(3)
例如,以下所有数字都可以用 a 表示
FLOAT(3)
,因为它们只有 1 个有效数字:2 (2e0)
30 (3e1)
400 (4e2)
5000 (5e3)
60000 (6e4)
相比之下,以下数字虽然在某些情况下较小,但需要更多有效数字:
24 (24e0)
(2 位有效数字:24
)480 (48e1)
(2 位有效数字:48
)5001 (5001e0)
(4位有效数字5001
:)60300 (603e2)
(3 位有效数字:603
)在所有这些情况下,类型
FLOAT
所做的是将输入替换为最接近的近似数,该近似数可以在允许的有效位数内表示。例如,再看上面的例子,它们被替换成这样:24 --> 20 (2e1)
480 --> 500 (5e2)
5001 --> 5000 (5e3)
60300 --> 60000 (6e4)
理论上,当您想要控制列可以消耗的最大字节数并且您愿意为此牺牲值精度时,您会使用它。
但是 Oracle 本身建议,如果你有这个目标,最好使用已经明确定义了字节边界的类型,而不是
BINARY_FLOAT
在值的含义和效果非常混乱的地方乱搞。BINARY_DOUBLE
FLOAT(n)
n
而且,当然,如果你不打算让Oracle在精度超过一定限度时默默地代入值,那么最好使用在使用
NUMBER(n)
上更严格的类型,并且在使用时会抛出错误值超过定义的限制,而不是用近似值替换它。