如何在 Oracle SQL 中将整数除以产生浮点数?
Posted
技术标签:
【中文标题】如何在 Oracle SQL 中将整数除以产生浮点数?【英文标题】:How to divide integers in Oracle SQL to produce floating point numbers? 【发布时间】:2019-08-03 10:32:27 【问题描述】:我刚刚开始学习 Oracle SQL。我想我正在尝试划分与整数相同的 numeric
数据类型的两列。我想在表或float
数据类型中创建一个新列,将现有的numeric
列除以一个整数并将其值放入float
列。我正在将此代码用于划分和更新部分:
update Student set AVERAGE = TOTAL/3;
这里,TOTAL
是 numeric
列,AVERAGE
是 float
。但是当我使用以下方法打印表格时:
select * from Student;
, AVERAGE
以四舍五入的除法值显示。我尝试了在互联网上找到的两种解决方案:
update Student set AVERAGE = (TOTAL*1.00)/3;
还有:
update Student set AVERAGE = cast(TOTAL as float(2))/3;
但两者都不起作用。我究竟做错了什么? 这是我得到的输出:
ROLL_NO SNAME MATHS CHEM PHY TOTAL AVERAGE
---------- --------------- ---------- ---------- ---------- ---------- ----------
101 abcd 56 68 80 204 70
102 efgh 81 78 70 229 80
103 ijkl 69 73 78 220 70
104 mnop 90 89 92 271 90
105 qrst 80 89 79 248 80
【问题讨论】:
表格说明? 你真的想要浮点数吗?或者只是精确到小数位的数字结果? 我从未见过 Oracle 需要float
数据类型的情况。文档声明它是为了兼容性而提供的,并建议您改用binary_float
或binary_double
。我也从未见过需要这些。为什么你需要float
,具体来说?
@WilliamRobertson 你能在numeric
中获得十进制数字吗?我以为numeric
是Integers
的替代品
@ShantanuShinde 是的,尽管numeric
是number
的替代术语,它几乎总是用于任何数值。阅读data types 上的文档部分。
【参考方案1】:
首先,您需要了解 Oracle 中的 FLOAT
数据类型是什么意思。
Oracle
FLOAT
数据类型是NUMBER
数据类型的子类型。语法:
浮点数(p)
p 是二进制位的精度。
以下公式用于二进制和十进制之间的转换 精度:十进制 = 0.30103 * 二进制
现在,根据您得到的结果,我认为您的列 (AVERAGE
) 数据类型是 FLOAT(1)
。
如果您需要更高的精度,那么您需要在二进制中以更高的精度值更改您的表。
举个例子:
CREATE TABLE TEST (
f1 FLOAT,
f2 FLOAT(1),
f3 FLOAT(4),
f4 FLOAT(7)
);
INSERT
INTO
TEST(
f1,
f2,
f3,
f4
)
VALUES(
10 / 3,
10 / 3,
10 / 3,
10 / 3
);
select * from TEST;
输出:
db<>fiddle demo
如果您不提供任何精度,那么 Oracle 将采用最大精度(126 位 --> 37 位小数)。
上例中,f1、f2、f3、f4列的数据类型为FLOAT、FLOAT(1)、FLOAT(4)、FLOAT(7)。
f1、f2、f3、f4列对应的十进制精度为37(126 * 0.30103),1(1 * 0.30103) 、2 (4 * 0.30103) 和 3 (7 * 0.30103)。
所以,结论是 --> 根据您的要求更改您的表并更改AVERAGE
列的FLOAT
数据类型的精度。
干杯!!
【讨论】:
10 的精度为 2 位小数。我仍然不明白精度。号是什么?准确地代表。在大多数语言中,它只是没有。小数位数。 是的,只有在 FLOAT 的情况下,精度是二进制位。如果您想要 3 位小数的精度,那么您需要提供 3 / 0.30103 = 9.96 ~ 10 作为精度。请参阅以下example 中的 f5。如果您仍然发现问题,请使用 EDIT 选项在您的问题中添加表和示例数据的 DDL【参考方案2】:评论有点长。
average
列将根据该列的数据类型显示。 Oracle 会转换被划分的“数字”,所以结果是准确的,我认为使用数字类型。
你可以运行下面的代码,看到除法结果总是一样的:
select cast(10 as int) / cast(3 as int),
cast(10 as numeric) / cast(3 as numeric),
cast(10 as float) / cast(3 as float)
from dual;
所以操作数的数据类型没有区别。
另一方面,结果的数据类型确实如此。这些会产生不同的结果:
select cast(10 / 3 as int),
cast(10 / 3 as float),
cast(10 / 3 as number),
cast(10 / 3 as numeric(5, 1))
from dual;
【讨论】:
所以我应该将整个结果转换为TOTAL
吗?
@ShantanuShinde 。 . .不,您应该修复 average
的数据类型,以便它按您的意愿存储值。
另一个答案解决了它。问题是浮点数据类型的精度,它在 sql 中是二进制的,但其他语言只使用数字【参考方案3】:
在 Oracle 中,NUMBER
数据类型已经是浮点类型。不寻常的是,它是以 10 为底的浮点数类型,因此可以安全地用于涉及金钱的计算,但它仍然是浮点类型。 Docs here
可以定义一个仅包含整数的 NUMBER,方法是将子类型或特定字段定义为比例组件为 0,例如
nInt_value NUMBER(10,0);
或
SUBTYPE TEN_DIGIT_INTEGER_TYPE IS NUMBER(10,0);
在这种情况下,nInt_value
将只能保存 10 位或更少的整数。
请注意,SUBTYPE 仅在 PL/SQL 中可用 - 换句话说,您不能在 PL/SQL 模块中定义 SUBTYPE,然后将其用作数据库字段。 Docs here
【讨论】:
以上是关于如何在 Oracle SQL 中将整数除以产生浮点数?的主要内容,如果未能解决你的问题,请参考以下文章