精确
首先,这个经典的问题大家都知道
对于0.2+0.1这个数字,我们都知道是0.3
可是计算机执行的结果却是
0.30000000000000004
原因在于我们的计算机是二进制的。
浮点数没有办法是用二进制进行精确表示。我们的CPU表示浮点数由两个部分组成:指数和尾数,这样的表示方法一般都会失去一定的精确度,有些浮点数运算也会产生一定的误差。
例如:0.4的二进制表示并非就是精确的0.4。反而最为接近的二进制表示是 0.3999999999999999。
浮点数的值实际上是由一个特定的数学公式计算得到的。
如果我们使用BigDecimal类
我们可以看到,输出结果是正确的.
加减乘除的基本运算
刚才使用了一句
1
2System.out.println( a.add(b));
a.add(b)就是A+B
相应的
1
2
3
4
5
6
7
8public BigDecimal add(BigDecimal value); //加法 public BigDecimal subtract(BigDecimal value); //减法 public BigDecimal multiply(BigDecimal value); //乘法 public BigDecimal divide(BigDecimal value); //除法
如果我们使用,直接就可以写
1
2
3
4
5a.add(b) a.subtract(b) a.multiply(b) a.divide(b)
就可以进行加减乘除啦
这里有一点需要注意的是除法运算divide.
BigDecimal除法可能出现不能整除的情况,比如 4.5/1.3,这时会报错java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result.
具体的这个问题怎么解决建议百度,不再赘述.
举例写题
例如OJ上的这道题
C语言将要使用字符串来写
java只需要
1
2
3
4
5
6
7
8
9
10
11
12import java.math.BigDecimal; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); BigDecimal b1 = sc.nextBigDecimal(); BigDecimal b2 = sc.nextBigDecimal(); System.out.println(b1.add(b2)); } }
我们看到,这个代码就已经AC了
再例如
高精度乘法
1
2
3
4
5
6
7
8
9
10
11import java.math.BigDecimal; import java.util.Scanner; public class bigshu { public static void main(String[] args) { Scanner sc = new Scanner(System.in); BigDecimal a = sc.nextBigDecimal(); BigDecimal b = sc.nextBigDecimal(); System.out.println(a.multiply(b)); } }
作用很多,不仅仅是加减乘除
因为BigInteger和BigDecimal分别表示大整数类和大浮点数类,至于两个类的对象能表示最大范围不清楚,理论上能够表示无线大的数,只要计算机内存足够大
例如取绝对值也可以用
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15import java.math.BigDecimal; import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc = new Scanner(System.in); int n = sc.nextInt(); while (n--!=0) { BigDecimal a = sc.nextBigDecimal(); System.out.println(a.abs()); System.out.println(""); } } }
相应的还有
.remainder(); 取余
.pow(); a.pow(b)=a^b
.gcd(); 最大公约数
.abs(); 绝对值
.negate(); 取反数
.mod(); a.mod(b)=a%b=a.remainder(b);
.max(); min();
.punlic int comareTo();
.boolean equals(); 是否相等
快去使用啊啊啊
最后
以上就是神勇板栗最近收集整理的关于Java中BigInteger和BigDecimal的用法(写题真的很好用,还精确)的全部内容,更多相关Java中BigInteger和BigDecimal内容请搜索靠谱客的其他文章。
发表评论 取消回复