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验证的那个不太和谐的错误。