BigDecimal bug

本文详细解释了在使用不同版本的JDK编译代码时遇到的构造函数不匹配问题,并提供了三种解决方案:修改代码、更换JDK版本或指定bootclasspath参数以匹配目标JDK版本。

使用jdk1.5,jdk1.6 编译成jdk1.4 的代码时,
如果使用如下代码

import java.math.BigDecimal;

 public class Test {
        public static void main(String[] args) { 
              BigDecimal dec = new BigDecimal(1); }
 }

 报错: Exception in thread "main" java.lang.NoSuchMethodError: java.math.BigDecimal.<init>(I)V at Test.main(Test.java:6)

原因:
jdk1.5后增加了int型的构造函数,所以用jdk1.5包括jdk1.6都没有问题,即使增加-target 1.4,编译也没有问题。
但运行报构造函数不存在。


解决方案:
1.改成下面的代码
BigDecimal dec = new BigDecimal((double) 1);
2.换jdk1.4来编译

3.指定-bootclasspath 指定1.4的rt.jar

参考:
As part of jsr 13, a new constructor, BigDecimal(int val), was added to BigDecimal in JDK 5. Therefore, in 1.4 and earlier new BigDecimal(1) in the source resolves to BigDecimal(double) while in 1.5 it resolves to BigDecimal(int), which is not present in earlier JDKs. The -source flag of javac only restricts the constructs in the source languge (e.g. assert, generics); it does *not* restrict or filter the contents of the libraries. Therefore, in JDK5 if you compile with "javac -source 1.4" you will still be compiling against the 1.5 version of the libraries. Therefore, in cases like the one in this bug, code compiled at a lower language level might not be able to be used with an ealier release supporting that language level. To match both the language and libraries of an ealier jdk, use -source and the -bootclasspath flag to specify the earlier rt.jar as well. Of course the ealier jdk could be used too.

本版中只有一个用于生产环境的文件:BigDecimal-all-last.min.js,大小为26K,如果WEB服务器打开GZIP压缩,可以减小至7K,如需完整版本请移步至:http://download.youkuaiyun.com/detail/aquaqu2009/4575230 简单用法: var scale = 20; var e = new BigDecimal("0"); var denominator = new BigDecimal("1"); var eBefore = new BigDecimal("-1"); var iteration = 1; while (!e.equals(eBefore)) { eBefore = e; e = e.add(BigDecimal.prototype.ONE.divide(denominator, scale, BigDecimal.prototype.ROUND_HALF_UP)); denominator = denominator.multiply(new BigDecimal(iteration+'')); ++iteration; } equal(e.toString(), "2.71828182845904523536"); ok(new BigDecimal("1234.5678").isPositive(), "1234.5678 is positive"); ok(new BigDecimal("-1234.5678").isNegative(), "-1234.5678 is negative"); ok(!BigDecimal.prototype.ZERO.isPositive() && !BigDecimal.prototype.ZERO.isNegative(), "BigDecimal.prototype.ZERO is neither positive nor negative"); ok(BigDecimal.prototype.ZERO.isZero(), "BigDecimal.prototype.ZERO is zero"); ok(new BigDecimal("1234.0000").isLessThan(new BigDecimal("1234.5678")) && new BigDecimal("1234.0000").isLessThanOrEqualTo(new BigDecimal("1234.5678")), "1234.0000 is less than 1234.5678"); ok(!new BigDecimal("1234.0000").isGreaterThan(new BigDecimal("1234.5678")) && !new BigDecimal("1234.0000").isGreaterThanOrEqualTo(new BigDecimal("1234.5678")), "1234.0000 is not greater than 1234.5678"); ok(new BigDecimal("1234.5678").isGreaterThan(new BigDecimal("1234.0000")) && new BigDecimal("1234.5678").isGreaterThanOrEqualTo(new BigDecimal("1234.0000")), "1234.5678 is greater than 1234.0000"); ok(!new BigDecimal("1234.5678").isLessThan(new BigDecimal("1234.0000")) && !new BigDecimal("1234.5678").isLessThanOrEqualTo(new BigDecimal("1234.0000")), "1234.5678 is not less than 1234.0000"); ok(new BigDecimal("1234.5678").isLessThanOrEqualTo(new BigDecimal("1234.5678")) && new BigDecimal("1234.5678").isGreaterThanOrEqualTo(new BigDecimal("1234.5678")), "1234.5678 is less than or equal to itself as well as greater than or equal to itself"); 别整个复制粘贴啊,那样是运行不起来的,请粘贴您需要的代码,,
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值