如何在Oracle SQL中除法整数以生成浮点数?

如何在Oracle SQL中除法整数以生成浮点数?,sql,oracle,sqlplus,Sql,Oracle,Sqlplus,我刚刚开始学习Oracle SQL。我试图将两列numeric数据类型分开,我认为这是一个整数。我想在表或float数据类型中创建一个新列,将一个现有的numeric列除以一个整数,并将其值放入float列中。我将此代码用于划分和更新部分: update Student set AVERAGE = TOTAL/3; 这里,TOTAL是numeric列,AVERAGE是float。但当我使用以下方式打印表格时: select * from Student; ,平均值以除法的四舍五入值显示。我尝

我刚刚开始学习Oracle SQL。我试图将两列
numeric
数据类型分开,我认为这是一个整数。我想在表或
float
数据类型中创建一个新列,将一个现有的
numeric
列除以一个整数,并将其值放入
float
列中。我将此代码用于划分和更新部分:

update Student set AVERAGE = TOTAL/3;
这里,
TOTAL
numeric
列,
AVERAGE
float
。但当我使用以下方式打印表格时:

select * from Student;
平均值
以除法的四舍五入值显示。我尝试了在互联网上找到的两种解决方案:

update Student set AVERAGE = (TOTAL*1.00)/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

这是一个有点长的评论

将根据该列的数据类型显示列
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;

这是一个有点长的评论

将根据该列的数据类型显示列
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;

首先,您需要了解Oracle中的
FLOAT
数据类型的含义

Oracle
FLOAT
数据类型是
NUMBER
数据类型的子类型

Synatx:

浮动(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;
输出:

如果不提供任何精度,则Oracle将采用最大精度(126位) -->37(十进制)

在上面的示例中,列f1、f2、f3和f4的数据类型是FLOAT、FLOAT(1)、FLOAT(4)和FLOAT(7)


列f1、f2的相应小数精度首先,您需要了解Oracle中的
FLOAT
数据类型的含义

Oracle
FLOAT
数据类型是
NUMBER
数据类型的子类型

Synatx:

浮动(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;
输出:

如果不提供任何精度,则Oracle将采用最大精度(126位) -->37(十进制)

在上面的示例中,列f1、f2、f3和f4的数据类型是FLOAT、FLOAT(1)、FLOAT(4)和FLOAT(7)


Oracle中的数据类型数字中的列f1、f2的相应精度(以十进制数字表示)已经是浮点类型。它的不同寻常之处在于它是一种以10为基数的浮点数类型,因此可以安全地用于涉及金钱的计算,但它仍然是一种浮点数类型

通过将子类型或特定字段定义为比例分量为0,可以定义仅包含整数的数字,例如:

nInt_value    NUMBER(10,0);

在这种情况下,
nInt_值
只能容纳10位或更少的整数


请注意,子类型仅在PL/SQL中可用-换句话说,您不能在PL/SQL模块中定义子类型,然后将其用作数据库字段

在Oracle中,
数字
数据类型已经是浮点类型。它的不同寻常之处在于它是一种以10为基数的浮点数类型,因此可以安全地用于涉及金钱的计算,但它仍然是一种浮点数类型

通过将子类型或特定字段定义为比例分量为0,可以定义仅包含整数的数字,例如:

nInt_value    NUMBER(10,0);

在这种情况下,
nInt_值
只能容纳10位或更少的整数


请注意,子类型仅在PL/SQL中可用-换句话说,您不能在PL/SQL模块中定义子类型,然后将其用作数据库字段

表说明?您真的想要浮点吗?或者只是精确到小数点的数字结果?我从未见过Oracle中需要数据类型的情况。该文档说明,它是为了兼容性而提供的,并建议您改用
binary\u float
binary\u double
。我也从来没有看到有必要这样做。你为什么需要
浮点数
?我认为
numeric
Integers
@ShantanuShinde的替代词是的,尽管
numeric
number
的替代词,几乎总是用于任何数值。阅读.descripp表上的文档部分