今天在写程序的时候发现了一个问题,公司的代码是基于JDK1.4的,因为找不到1.4的JDK,我只能使用ant,通过设定source level的办法来控制编译结果:
<javac encoding="UTF-8" destdir="${dir.ext}/${dir.classes}" target="${javac.target.version}" classpathref="lib.class.path" deprecation="false" debug="${javac.debug}" optimize="${javac.optimize}" failonerror="true" source="1.4">
结果编译好的代码在1.5下边没法运行,出现下边的错误:
java.lang.NoSuchMethodError: java.math.BigDecimal.<init>(I)V
找到代码,看到BigDecimal对象的定义如下:
new BigDecimal(1);
再查看了一下API手册,发现
BigDecimal
public BigDecimal(int val)将 int 转换为 BigDecimal。BigDecimal 的标度为零。
参数:
val - 要转换为 BigDecimal 的 int 值。
从以下版本开始:
1.5
而
public BigDecimal(double val)将 double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。返回的 BigDecimal 的标度是使 (10scale × val) 为整数的最小值。
注:
此构造方法的结果有一定的不可预知性。有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入 到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好 等于预期的 0.1。因此,比较而言,通常建议优先使用 String 构造方法。
当 double 必须用作 BigDecimal 的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用 Double.toString(double) 方法,然后使用 BigDecimal(String) 构造方法,将 double 转换为 String。要获取该结果,请使用 static valueOf(double) 方法。
参数:
val - 要转换为 BigDecimal 的 double 值。
抛出:
NumberFormatException - 如果 val 为无穷大或 NaN。
猜想是不是编译的时候1.5优先把适合于自己的构造函数作为默认构造函数了,试了一下把BigDecimal对象的定义换为
new BigDecimal(1.0);
再运行,OK。BUG解决。
原因分析:在Java的内置类型的默认定义中,Int 型数据一般初始化为 1,2 ,3这种形式,而double型数据一般初始化为1.0,2.0,3.0这样的形式。因为在1.4的时候,API中不存在BigDecimal(int val) 这样的构造函数,JDK在编译的时候会在后台偷偷的将int型数据提升为double型数据,而在1.5的JDK中,由于已经存在BigDecimal(int val)这样的构造函数,编译器就会直接将Int型数据作为默认数据输入,进而造成了先前的找不到构造函数的错误。
PS:这个不知道算不算是JDK的一个bug? 用高版本的JDK编译低版本的Java代码的人估计还不少。
分享到:
相关推荐
BigDecimal类,常用方法是用介绍
javascript的数值精确计算类bigdecimal,改编自java的bigdecimal
BigDecimal工具类.docx
在 Java 编程中,经常需要对数字类型的数据进行...例如,在上面的示例代码中,若输入的 BigDecimal 值为 2147483648 时,intValue() 方法将抛出“Out of range”异常。此时,可以使用 BigInteger 类型来表示大整数。
alert(new BigDecimal("10").add(new BigDecimal("3E+10"))); //- alert(new BigDecimal("10").subtract(new BigDecimal("3E+10"))); //* alert(new BigDecimal("10").multiply(new BigDecimal("3E+10"))); // / ...
BigDecimal的计算
java丢失精度,bigdecimal加减乘除
Java中BigInteger的数学运算,BigDecimal 加减乘除运算,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大...
复杂的BigDecimal计算,需要开方的式子,可输入结果精确位数
BigDecimal向Double转换
构造函数:解决了上面这个问题好像万事大吉了,结果,我在做测试的时候,又发现了一个莫名其妙的问题,代码如下: BigDecimal bd=supplierRecentProductDao.findHistoryReturnRate("001", "001"); assertEquals(bd....
bigdecimal转integer
BigInteger.java BigDecimal.java 文件 源代码
bigdecimal加减乘除运算
string转bigdecimal类型
js中引入BigDecimal-all-last.min.js
Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE程序 BigDecimal类Java SE...
MyEditTextApplication输入框BigDecimal计算价格,实时输入计算价格并保留小数点后十位数字
BigDecimal运算封装,里面封装了Integer和BigDecimal的"加减乘除法运算封装
本版中只有一个用于生产环境的文件:BigDecimal-all-last.min.js,大小为26K,如果WEB服务器打开GZIP压缩,可以减小至7K,如需完整版本请移步至:http://download.csdn.net/detail/aquaqu2009/4575230 简单用法: ...