Sql Oracle中的分数舍入

Sql Oracle中的分数舍入,sql,oracle,Sql,Oracle,有人能解释一下这个SQL查询的结果吗 select (1/3)*30 x1, to_number(1/3)*30 x2, floor( (1/3)*30) x3, floor(to_number(1/3)*30) x4 from dual; 结果如下: X1 X2 X3 X4 10 10 10 9 编辑 这个怎么样?一位数的差异 WITH test A

有人能解释一下这个SQL查询的结果吗

select 
                 (1/3)*30  x1,
        to_number(1/3)*30  x2,
  floor(         (1/3)*30) x3,
  floor(to_number(1/3)*30) x4
from dual;
结果如下:

X1      X2      X3      X4
10      10      10       9
编辑

这个怎么样?一位数的差异

WITH test AS (
    SELECT
        0.333333333333333333333333333333333333333  digits_39,
        0.3333333333333333333333333333333333333333 digits_40
    FROM dual
)
SELECT

    digits_39*30                     digits_39_1,
    FLOOR(digits_39*30)              digits_39_2,
    FLOOR(         (digits_39)*30)   digits_39_3,
    FLOOR(TO_NUMBER(digits_39)*30)   digits_39_4,

    digits_40*30                      digits_40_1,
    FLOOR(digits_40*30)               digits_40_2,
    FLOOR(         (digits_40)*30)    digits_40_3,
    FLOOR(TO_NUMBER(digits_40)*30)    digits_40_4

FROM test;
结果:

DIGITS_39_1     DIGITS_39_2     DIGITS_39_3     DIGITS_39_4
         10               9               9               9
DIGITS_40_1     DIGITS_40_2     DIGITS_40_3     DIGITS_40_4
         10              10              10               9  
答案很简单。
(1/3)*30
当解释为
30/3
时给出
10

这就是您的1st3rd表达式所发生的情况。因为处理器把它作为分数而不是小数

但是当被看作像
(0.3333)*30这样的小数时,它给出
9.999

当您隔离(1/3)并将
添加到\u number()
中时,此处会丢失精度

它只给了你
0.333333
,因此
0.333333*30=9.9999

下限(9.9999)=9
(四舍五入到最小整数值)


编辑:

有趣的是。(第二个表达式,
to_number(1/3)*30

SQL开发人员, 输出为

但是SQL*Plus,给出

        X1         X2         X3         X4 TO_NUMBER(1/3)
---------- ---------- ---------- ---------- --------------
        10         10         10          9     .333333333 

最后,来自

Oracle保证数字的可移植性,精度高达 20位基数-100位,相当于39位或40位小数 取决于小数点的位置

所以,它的最大值就是四舍五入。您可以尝试将30替换为3,然后进行检查

第一个是39位小数,第二个是40位小数