十进制问题(Oracle 11G)

时间:2014-09-10 01:12:10

标签: oracle

我正在使用Pl / Sql开发人员在我们的一个Oracle数据库上调试问题并发现了这个问题。

这是我在Pl / SQL上运行的select语句:

SELECT  24*(t.plan_f_date - t.plan_s_date),
t.plan_hrs,
24*(t.plan_f_date - t.plan_s_date) - t.plan_hrs
FROM active_Separate t
WHERE t.wo_no = 613484;

这是我得到的结果:

-----------------------
a        b         c
-----------------------
.5       .5        8E-40

只要看一下,a = .5和b = .5;因此a-b(即c)应为0,但它是8E-40。

以前有人见过这个问题吗?

Plan_hrs的类型为NUMBER,plan_f_date和plan_s_date的类型均为DATE。

提前致谢。

1 个答案:

答案 0 :(得分:5)

我假设你的查询别名如下:

SELECT  24*(t.plan_f_date - t.plan_s_date) as a,
        t.plan_hrs as b,
        24*(t.plan_f_date - t.plan_s_date) - t.plan_hrs as c
FROM ...

我能够使用以下测试数据生成类似的结果:

WITH testdata AS (
  select to_date('00:30','HH24:MI') as plan_f_date
        ,to_date('00:00','HH24:MI') as plan_s_date 
        ,0.5 AS plan_hrs
  from dual
)
SELECT  24*(t.plan_f_date - t.plan_s_date) as a,
        t.plan_hrs as b,
        24*(t.plan_f_date - t.plan_s_date) - t.plan_hrs as c
FROM testdata t;

a: 0.4999999999999999999999999999999999999992
b: 0.5
c: -0.0000000000000000000000000000000000000008

这些不准确的结果是因为日期精确到秒,日期的减法返回一个数字,其中1 = 1天,最小单位(1秒)等于大约0.00001157407407407407407407407407407407407407一天,所以你是一旦你对结果进行乘法运算,就会发现小错误。

因此,您可能需要将结果舍入为0(零)。

相关问题