1#的方法没问题,但是它的结果错了。bd是对象,那样做不会有加法效果的。应该重新赋一次值。 import java.math.*;//1000000000.1234567890123456+0.1234567890123456 public class Digits { public static void main(String args[]){ double a = 1000000000.1234567890123456 + 0.1234567890123456;
MathContext mc = new MathContext(26);//前提是知道小数点之前有多少位 BigDecimal sum = new BigDecimal(a, mc);
System.out.println(sum); } }
楼上两位都错了.Java中要进行精确解的计算,前提有2点 1.精确的构造出BigDecimal对象 2.使用BigDecimal对象进行计算1楼的错误在于构造BigDecimal时构造函数选择的错误 BigDecimal bd=new BigDecimal(1000000000.1234567890123456); 应该使用 BigDecimal bd=new BigDecimal("1000000000.1234567890123456"); 为什么后面我们会说到2楼的错误在于 double a = 1000000000.1234567890123456 + 0.1234567890123456; 这样计算出来的结果本身已经不是一个精确解了 我们可以进行一个实验 System.out.println(2.00 - 1.10); 结果并不是0.1 为什么呢 因为Java中使用double,float进行计算时,有一个二进制的转化过程,但是十进制的0,1在转为二进制数时,结果是一个循环小数,根本无法被二进制精确表示,所以出现了2.00-1.10!=0.1的情况所以我们在java进行精确计算时,一定要使用BigDecimal类lz的计算可以这样满足 BigDecimal x = new BigDecimal("1000000000.1234567890123456"); BigDecimal y = new BigDecimal("0.1234567890123456"); BigDecimal z = x.add(y).setScale(16, RoundingMode.HALF_UP); 要注意的是构造BidDecimal,一定要用String去构造,千万不要用int,float,double去构造,哪怕new BigDecimal(0)也不可以,一定要用new BigDecimal("0") 涉及到精度问题.
BigDecimal bd=new BigDecimal(1000000000.1234567890123456);
bd.add(new BigDecimal(0.1234567890123456));
System.out.println(bd);
DecimalFormat format=new java.text.DecimalFormat();
format.setMinimumFractionDigits(16);
format.setMinimumIntegerDigits(10);
format.setParseBigDecimal(true);
format.setGroupingUsed(false);
System.out.println(format.format(bd));
}
import java.math.*;//1000000000.1234567890123456+0.1234567890123456 public class Digits {
public static void main(String args[]){
double a = 1000000000.1234567890123456 + 0.1234567890123456;
MathContext mc = new MathContext(26);//前提是知道小数点之前有多少位
BigDecimal sum = new BigDecimal(a, mc);
System.out.println(sum);
}
}
1.精确的构造出BigDecimal对象
2.使用BigDecimal对象进行计算1楼的错误在于构造BigDecimal时构造函数选择的错误
BigDecimal bd=new BigDecimal(1000000000.1234567890123456);
应该使用
BigDecimal bd=new BigDecimal("1000000000.1234567890123456");
为什么后面我们会说到2楼的错误在于
double a = 1000000000.1234567890123456 + 0.1234567890123456;
这样计算出来的结果本身已经不是一个精确解了
我们可以进行一个实验
System.out.println(2.00 - 1.10);
结果并不是0.1
为什么呢
因为Java中使用double,float进行计算时,有一个二进制的转化过程,但是十进制的0,1在转为二进制数时,结果是一个循环小数,根本无法被二进制精确表示,所以出现了2.00-1.10!=0.1的情况所以我们在java进行精确计算时,一定要使用BigDecimal类lz的计算可以这样满足
BigDecimal x = new BigDecimal("1000000000.1234567890123456");
BigDecimal y = new BigDecimal("0.1234567890123456");
BigDecimal z = x.add(y).setScale(16, RoundingMode.HALF_UP);
要注意的是构造BidDecimal,一定要用String去构造,千万不要用int,float,double去构造,哪怕new BigDecimal(0)也不可以,一定要用new BigDecimal("0")
涉及到精度问题.
哈哈,惭愧,我确实不知道BigDecimal有这两种初始化的差异。学习了!