首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >pl/sql程序员在进行货币计算时经常犯的错误是什么?

问pl/sql程序员在进行货币计算时经常犯的错误是什么?
EN

Stack Overflow用户
提问于 2011-08-26 10:09:24
回答 3查看 1.8K关注 0票数 11

嗨,在那里,我正在寻找pl/sql程序员在编写处理大量货币计算的应用程序时犯的常见错误。(折扣、税费、差价等)我一直使用java和hibernate进行货币计算,自从我记事以来,java有一套规则和最佳实践,如BigDecimal,以保持精度等。现在我正在努力提高我在处理金融模块时的pl/sql技能,这就是为什么我想知道这些陷阱并避免它们。另外,是否有任何现有的mantra或pl/sql的最佳实践?提前谢谢各位。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-08-27 12:06:50

使用此示例:

代码语言:javascript
复制
create table t_val
  (id number(10,0),
  value number(5,2));

declare
  v_dummy number;
begin
  delete from t_val;
  for i in 9 .. 20 loop
    insert into t_val values (i, 1/i);
    select count(*)
    into v_dummy 
    from t_val 
    where value = 1/i;
    dbms_output.put_line(to_char(i,'00')||':'||v_dummy||':'||
              to_char(1/i,'000.999999'));  
  end loop;
  --
end;
/

select id, value from t_val order by 1;

您可以看到,例如,代码插入了0.11111,当代码立即尝试计算0.11111的值时,它隐式四舍五入为0.11,但找不到任何匹配。

同样,(1/14)和(1/15)的值都四舍五入为0.07。

这不是PL/SQL特有的问题,我在Java和PHP代码中也看到过类似的问题,当'client‘中的值进入数据库时,它会被舍入。但是,PL/SQL确实提供了更好的解决方案,因为您可以声明特定表/列的类型的变量,并且即使列发生更改,此绑定也会保持不变。

代码语言:javascript
复制
declare
  v_value  t_val.value%type;
  v_dummy number;
begin
  delete from t_val;
  for i in 9 .. 20 loop
    v_value := 1/i;
    insert into t_val values (i, v_value);
    select count(*)
    into v_dummy 
    from t_val 
    where value = v_value;
    dbms_output.put_line(to_char(i,'00')||':'||v_dummy||':'||
            to_char(1/i,'000.999999')||':'||to_char(v_value,'000.999999'));  
  end loop;
  --
end;
/

因此,最佳实践是,在处理SQL语句时,使用锚定到基础表的类型(包括长度/小数位数/精度)的绑定变量。

票数 6
EN

Stack Overflow用户

发布于 2011-08-29 04:39:43

这里有两个快速提示:

Oracle实用技巧:将NUMBER (不带小数位数/prec)用作表列类型和在PL/SQL中使用。为你省去了很多麻烦。数字(x,y)不会为您节省任何存储或cpu周期。

一般的提示(你想要先了解大局):

  • 首先,研究一下你的应用程序对十进制运算的具体要求是什么:你要交税吗?如果是,是美国还是欧盟?取整规则因司法辖区和/或应用程序而异。Oracle SQL是否支持所需的内容?PL/SQL有吗?如果不是这样,错误就是使用PL/SQL来做这些事情。
  • 即将到来的十进制运算的黄金标准是IEEE decimal128。你可能想在维基百科上读一读,也许http://www.carus-hannover.de/doc/DFP_PW6_in_SAP_NetWeaver_0907.pdf也是一个例子。它支持所有风格的舍入等。不知道何时涉及到Oracle QL / PL/SQL
票数 6
EN

Stack Overflow用户

发布于 2011-09-04 01:05:27

使用任何语言处理货币类型的问题是:

  • Truncation -当你应该四舍五入,但结果是truncated.
  • Rounding -当你应该截断,但它被四舍五入。

如果你在每一步都注意这些,那么处理金钱并不是一件困难的工作。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7199344

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档