如何在 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;

这里,TOTALnumeric 列,AVERAGEfloat。但是当我使用以下方法打印表格时:

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_floatbinary_double。我也从未见过需要这些。为什么你需要float,具体来说? @WilliamRobertson 你能在numeric 中获得十进制数字吗?我以为numericIntegers 的替代品 @ShantanuShinde 是的,尽管numericnumber 的替代术语,它几乎总是用于任何数值。阅读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 中将整数除以产生浮点数?的主要内容,如果未能解决你的问题,请参考以下文章

整数除以浮点数得到成比例的整数

一致性:将整数除以 2 的幂与 10 的幂?

格式化查询以在 Oracle SQL 中显示浮点小数

为什么整数除以零1/0会给出错误,但浮点1 / 0.0会返回“Inf”?

如何在 Java 中将整数转换为浮点数?

python 在Pandas(Python)中将整数转换为浮点格式