我有一个类(让我们称之为Money)来处理货币价值的计算。它是BigDecimal的包装器,并使用正确的小数精度。多年来它一直运作良好,但我们发生了一些事件,有一些重大影响,需要确定原因,如果使用这个类是原因。
我们使用jExcelApi从Excel文件中读取值。我们使用此API是因为我们使用的文件是Excel 2003文件。使用getContents
方法从该文件中读取该值。 Excel文件中的字段采用General
格式,读取后,结果使用Money类的以下静态方法实例化money类的新实例:
public static Money valueOf(String s, int precision) {
try {
Number n = format.parse(s);
return new Money(new BigDecimal(n.doubleValue()), precision);
}
catch (ParseException e) {
throw new IllegalArgumentException("Cannot convert as money " + s);
}
}
precision
为2,格式为DecimalFormat("#0.00###;-0.00###")
e.g。
Money amount = Money.valueOf(sheet.getCell(col, row).getContents());
因此在工作表中使用1500
(无小数)的值并用作输入。发生了什么事情,这个价值以某种方式以下列方式重复
15150000
造成严重夸大的金额。就好像在数字之间推入了相同的值。所以不是1500,而是1500万。
我一直无法复制这个问题。始终正确计算值。很可能系统当时正在高峰运行并且正在使用交换空间,但我不知道这将如何仅影响具有相同数量的超过3500条记录的一条记录。
有什么想法吗?是否可能没有清除内存?
我们的技术堆栈:
Ubuntu 15.04带8GB RAM
Java 8
Tomcat 8.5
MySQL 5.7.15