`
fcmfcm01
  • 浏览: 66586 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

BigDecimal在1.5编译时的错误

阅读更多

今天在写程序的时候发现了一个问题,公司的代码是基于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类

    * 由于一般数值类型,例如 double,不能准确地代表 16 位有效数以上的数字,在使用 BigDecimal 时,应用 BigDecimal(String) 构造器创建对象才有意义。 * 不能使用传统的+、-、*、/等算术运算符直接对其对象进行数学...

    javascript版BigDecimal类库

    - **版本兼容性**:在使用特定版本如`js_bigdecimal_1_0_1`时,确保与你的项目环境兼容,并查阅其文档以获取详细的使用指南和API说明。 总的来说,JavaScript版`BigDecimal`类库为开发者提供了一种解决JavaScript...

    BigDecimal.js.zip

    在JavaScript编程语言中,处理大型数字的精确计算是一项挑战,因为JavaScript的内置Number类型在进行大整数或高精度浮点数运算时容易出现精度损失。为了解决这个问题,开发者通常会引入第三方库,比如"BigDecimal.js...

    java BigDecimal操作

    总的来说,理解和熟练运用BigDecimal是每个Java开发者必备的技能之一,特别是在处理货币计算、财务计算等场景时,能够避免因为浮点数精度问题导致的错误。在使用BigDecimal时,一定要注意其性能开销,因为它比基本的...

    bigdecimal

    在Java编程语言中,当我们处理涉及货币、财务或者任何需要高精度计算的场景时,`BigDecimal` 类是非常重要的工具之一。本文将深入探讨 `BigDecimal` 类的基本概念、特点以及如何使用它来进行精确的算术运算。 #### ...

    BigDecimal工具类.docx

    在BigDecimal工具类中,我们可以看到多个重载的方法,例如add方法和sub方法,这些方法可以根据不同的参数类型和精度需求进行选择。 首先,让我们来看一下add方法。add方法有三种重载形式,分别是add(double,double)...

    MyEditTextApplication输入框BigDecimal计算价格

    7. **UI更新**:在更新EditText中的显示时,应该在UI线程进行,否则可能会导致ANR(Application Not Responding)错误。可以使用runOnUiThread()方法或者Handler来保证更新操作在正确的线程中执行。 综上所述,...

    bigdecimal转integer.docx

    `intValueExact()` 会在 `BigDecimal` 不是整数时抛出 `ArithmeticException`。例如: ```java BigDecimal bigDecimal = new BigDecimal(100.567); int intValue = bigDecimal.setScale(0, BigDecimal.ROUND_...

    BigDecimal的计算

    它适用于金融计算、科学计算等场景,在这些场景中,使用浮点数(如 `float` 和 `double`)可能会因为精度丢失而导致错误的结果。本文将基于提供的代码片段来详细解释如何使用 `BigDecimal` 进行计算,并深入探讨其...

    BigDecimal向Double转换

    - **避免浮点数运算误差**:在处理涉及小数点的运算时,使用BigDecimal可以避免由浮点数运算带来的误差问题。 ## 二、BigDecimal到Double的转换 ### 2.1 使用doubleValue()方法 最简单的方式是通过BigDecimal类...

    BigDecimal使用

    在使用 BigDecimal 时需要注意以下几点: * BigDecimal 对象是不可变的,因此在进行运算时需要创建新的对象。 * BigDecimal 对象可以使用 toString 方法将其转换为字符串。 * 在进行除法运算时,需要注意除数不能为...

    BigDecimal-CPP-master.zip

    BigDecimal是一种可以处理任意精度的十进制浮点数的数据类型,它通常用于金融或会计等需要高精度计算的领域,因为在这些场景中,浮点数的精度丢失可能导致错误的结果。 在计算机科学中,浮点数(如`float`和`double...

    JS的高精度计算(BigDecimal)

    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加减乘除计算

    在进行高精度计算时,BigDecimal 避免了浮点数计算的精度问题,提供了更精确的结果。需要注意的是,所有涉及到 BigDecimal 的运算都会创建新的对象,所以频繁操作可能会带来性能影响。为了优化性能,可以使用 `...

    java中BigDecimal的操作方法

    在进行商业计算时,由于浮点数(double和float)存在精度问题,不能保证准确的结果,因此通常推荐使用BigDecimal来确保计算的精确性。本文将深入探讨BigDecimal的基本操作、应用场景及注意事项。 首先,创建...

    js_bigdecimal_1_0_1.zip

    在JavaScript中,大数计算通常会遇到精度问题,因为JavaScript的Number类型在处理超过一定位数的数值时会出现精度丢失。为了解决这个问题,开发者引入了BigDecimal库,它提供了高精度的大数运算支持。"js_bigdecimal...

    java-BigInteger-BigDecimal类源码

    4. **舍入模式**:在执行除法运算时,`BigDecimal`提供了多种舍入模式,如`ROUND_UP`, `ROUND_DOWN`, `ROUND_HALF_EVEN`等,以决定结果如何处理超出精度的数字。 5. **不可变性**:同样,`BigDecimal`对象也是不可...

    Bigdecimal.js

    在IT行业中,尤其是在涉及到金融、电子商务等领域,精准的数值计算是至关重要的。"Bigdecimal.js"就是这样一...通过深入理解和应用这个库,开发者能够确保他们的应用程序在进行关键计算时不会因为精度问题而引入错误。

    关于BigDecimal的构造函数与大小比较

    构造函数:解决了上面这个问题好像万事大吉了,结果,我在做测试的时候,又发现了一个莫名其妙的问题,代码如下: BigDecimal bd=supplierRecentProductDao.findHistoryReturnRate("001", "001"); assertEquals(bd....

    BigDecimal 加减乘除运算

    Java中BigInteger的数学运算,BigDecimal 加减乘除运算,Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数。在实际应用中,需要对更大...

Global site tag (gtag.js) - Google Analytics