用精确的oracle划分和插入

时间:2016-04-08 05:43:14

标签: oracle numbers precision

我需要在查询中精确地在表中插入一条记录。例如:

insert into spend_amount (record_no,purchase_amount) 
values ('1',(to_number(100.99/2))); 

我有一个purchase_amount列作为VARCHAR2。因此,在执行此查询时,它将插入为50.495。但我只需插入两个精度位置。预期结果应为50.49或应为50.50。怎么做到这一点?

2 个答案:

答案 0 :(得分:2)

Oracle SQL包含round()函数。第一个参数是值,第二个参数控制舍入程度。所以要舍入到小数点后两位:round((100.99/2),2)Find out more

不确定您为什么在示例代码中进行了to_number()调用,因为您已经拥有 一个数字。此外,将数值存储为字符串是一个非常糟糕的主意:它是一辈子不必要的痛苦。

答案 1 :(得分:1)

首先,将purchase_amount之类的数值存储为varchar2是没有意义的。它确实应该存储为一个数字,在这种情况下,它实际上会有你自动指定的精度。

其次,在数值上调用to_number是没有意义的。 to_number只接受一个字符串。因此,如果传入一个数值,Oracle必须隐式地将数字转换为字符串,然后to_number显式地将字符串转换回一个数字,只是为了让你回到你开始的地方。

如果要将值四舍五入为50.5,请使用round。如果要将值截断为50.49,请使用trunc

insert into spend_amount( record_no, purchase_amount )
  values( 1, round( 100.99/2, 2 ));

insert into spend_amount( record_no, purchase_amount )
  values( 1, trunc( 100.99/2, 2 ));