ADF中的算术计算问题

       ADF中的计算主要涉及加减乘除其它、取位(格式化)这两个方面。现就我在实际项目中遇到的问题做一个小结。

       一、加减乘除其它 -----以BigDecimal为例

       推荐使用的两个类是BigDecimal和Number。一个是JDK中的java.math.BigDecimal,另一个是Oracle自封装的oracle.jbo.domain.Number。这两个类对于算术计算提供了很多便利,特别是你需要对计算结果进行类型转换或者做进位、直接截取等处理时。

       在ADF中个人推荐使用Number,个人习惯而已,呵呵。OK,步入正题。

        容易出问题的情况有以下三种:

       (1)定义:BigDecimal bd= new BigDecimal("1.46");  //最好使用字符串做初始化。

                    如果你使用这个BigDecimal bd= new BigDecimal(1.46); 那么很可能你的计算结果会很长,原因,你懂的。(和使用float差不多)

                另一种形式就是:Float f=1.46f;

                                   BigDecimal bd= new BigDecimal(f.toString());  //其他类型可以先转化成字符串

      (2)在算除法的时候要注意:

                BigDecimal eurpri = rmbpri.divide(eurcur,5,BigDecimal.ROUND_HALF_EVEN);

                 //参数不是一位哦,建议看好api,寻找适合的规则,这时是取五位小数

      (3)容易犯迷糊的问题:

                total.add(nowcur).multiply(new BigDecimal("1.1")).multiply(new BigDecimal("0.0007"));

                //注:类型都是BigDecimal

                结果是算出来了,但是没有保存,应该是

                total=total.add(nowcur).multiply(new BigDecimal("1.1")).multiply(new BigDecimal("0.0007"));

      二、取位(格式化)-----以Number为例

             主要有三种情况:

             (1)最终结果取位:

                                               new Number(ppTemp.round(5)) ; //四舍五入,保留五位小数

                                               new Number(ppTemp.truncate(5)) ; //直接截取,保留五位小数

             (2)中间结果取位:

                      可以借助java.text.DecimalFormat类。

                      DecimalFormat df  = new DecimalFormat("##0.00000"); //四舍五入,保留五位小数

                      df.format(total.multiply(cktsl);

             (3)用户输入的数值:

                     比如说用户输入五位小数 2.13562 ,页面上会自动把它转成四舍五入的三位小数 2.136。

               开始的时候我也感觉很奇怪,检查数据库是五位的小数,检查eo也是五位的,检查vo是oracle.jbo.Number,其它地方也没有刻意让它变成三位的。

               我故意在页面填写个五位的2.13562 ,直接提交,发现还是四舍五入留三位到数据库中2.13600。闹不清是什么原因,猜测可能是oracle默认的就是三位的小数。

               比较欣慰的是解决方案已经摸索出来了:

                     找到对应的vo,设置这个字段的属性:
                                                                                    Format Type:Number
                                                                                    Format:###0.00000
               这样就会把输入的单价自动转为五位小数,而且当你输入一个大于五位的小数时,也不会报eo验证的那个不太和谐的错误。

                                                   

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值