用精确的oracle划分和插入

divide and insert with precision oracle

我需要在 table 中精确插入一条记录。例如:

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

我有一个 purchase_amount 列作为 VARCHAR2。因此,在执行此查询时,它会插入为 50.495。但我只需要插入两个精度位置。预期结果应为 50.49 或四舍五入为 50.50。如何实现?

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

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

首先,将 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 ));