Sql Oracle中的分数舍入
有人能解释一下这个SQL查询的结果吗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
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
这就是您的1st和3rd表达式所发生的情况。因为处理器把它作为分数而不是小数
但是当被看作像(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位小数