下边这个式子和我的预想结果不一致,想知道ORACLE对这个计算作了那些内部处理。
         SELECT TRUNC((1/3)*3) FROM DUAL;
  〈预想结果〉 1
  〈实际结果〉  0
各位帮忙解释一下吧,谢谢

解决方案 »

  1.   

    1/3=0.333333333333333333333333333333333333333333...
    1/3*3=0.3333333333333333333333..*3=0.9999999999999999999999...
    没有trunc的时候四舍五入进位到1.
      

  2.   

    TRUNC函数不对指定小数前或后的部分做相应舍入处理,直接截取。
      

  3.   

    select trunc((1/3)*3,9) from dual;
      

  4.   

    trunc函数,是截取,没有四舍五入
    round函数,可四舍五入例: SELECT TRUNC((1/3)*3) FROM DUAL; 结果:0
    SELECT round((1/3)*3) FROM DUAL;     结果:1
      

  5.   

    感谢大家对我的帮助,但是上面的回答有些地方好像解释不清楚,看看下面的例子
    trunc((10/30)*30)         ->10  <和预想一致>
    trunc((100/300)*300)      ->99  <和预想不一致>
    trunc((1000/3000)*3000)   ->1000<和预想一致>
    trunc((10000/30000)*30000)->9999<和预想不一致>
      

  6.   

    IEEE 573 
    浮点数运算。首先在所有的计算机教科书中都讲到了 单/双精度的运算是不准确的!