JavaBigDecimal练习(1) (2024.7.22)
BigDecimalExercise1
package BigDecimalExercise20240722;
import java.math.BigDecimal;
public class BigDecimalExercise1 {
public static void main(String[] args) {
System.out.println(0.09 + 0.01); // 0.09999999999999999
// 在java中进行小数的运算,大部分时候都会产生精度丢失(c语言一般不会产生这样的情况)
/* 精度丢失产生的原因:因为计算机底层数据都是以二进制存储的,但是float和double类型
的小数位数是有限的,有可能无法表示完这么多位,所以说产生精度丢失
两个主要原因:1.有些小数无法用二进制精确表示,如:0.1,所以说存储时一定会产生精度丢失
2.float有23位小数位,double有52位小数位,所以说有些小数即使可以用很多位数二进制来精确表示
但是当超出这两个类型的小数位数之后,则会导致精度丢失 */
// 每个浮点数都会有一定误差,假如误差之间再进行运算,那么误差只会越来越大,产生不符合数学的结果
// 为了在一些需要精度计算的领域解决这个问题,引入了BigDecimal这个类,可以对Java中的浮点数精确计算
// 构造方法
// 1.BigDecimal(int value) 将一个int类型的整数转换为一个BigDecimal类
BigDecimal bigDecimal1 = new BigDecimal(123);
System.out.println(bigDecimal1);
// 2.BigDecimal(long value) 将一个long类型的长整数转换为一个BigDecimal类
BigDecimal bigDecimal2 = new BigDecimal(15646546546L);
System.out.println(bigDecimal2);
// 3.BigDecimal(String value) 将一个字符串转换为一个BigDecimal类
BigDecimal bigDecimal3 = new BigDecimal("4564654.4654");
System.out.println(bigDecimal3);
}
}
BigDecimalExercise2
package BigDecimalExercise20240722;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalExercise2 {
public static void main(String[] args) {
// BigDecimal的常用方法:主要是进行加减乘除的四则运算
// BigDecimal中的所有运算,都是精确计算,理论上不存在误差
// 1.add
BigDecimal bigDecimal1 = new BigDecimal("3.1415926");
BigDecimal bigDecimal2 = new BigDecimal("1.165466");
System.out.println(bigDecimal1.add(bigDecimal2)); // 绝对的精确,和理论值一模一样 4.3070586
System.out.println(3.1415926 + 1.165466); // 不用BigDecimal计算,则产生误差 4.3070585999999995
System.out.println("------------------------------------------------------");
// 2.subtract
BigDecimal bigDecimal3 = new BigDecimal("0.1");
BigDecimal bigDecimal4 = new BigDecimal("0.09");
System.out.println(bigDecimal3.subtract(bigDecimal4)); // 绝对精确 0.01,调用者减参数
System.out.println(0.1 - 0.09); // 产生误差 0.010000000000000009
System.out.println("------------------------------------------------------");
// 3.multiply
BigDecimal bigDecimal5 = new BigDecimal("0.1");
BigDecimal bigDecimal6 = new BigDecimal("0.1");
System.out.println(bigDecimal5.multiply(bigDecimal6)); // 绝对精确 0.01
System.out.println(0.1 * 0.1); // 产生误差 0.010000000000000002
System.out.println("------------------------------------------------------");
// 4.divide
BigDecimal bigDecimal7 = new BigDecimal("0.3");
BigDecimal bigDecimal8 = new BigDecimal("0.1");
System.out.println(bigDecimal7.divide(bigDecimal8, 2, RoundingMode.HALF_UP)); // 绝对精确 3
System.out.println(0.3 / 0.1); // 产生误差2.9999999999999996
// 不能除尽
BigDecimal bigDecimal9 = new BigDecimal("1");
BigDecimal bigDecimal10 = new BigDecimal("3");
System.out.println(bigDecimal9.divide(bigDecimal10, 2, RoundingMode.HALF_UP));
// 在BigDecimal中,假如不能除尽,则会抛出异常,或者指定一个舍入模式和精度。
// 2表示保留小数点后两位,RoundingMode.HALF_UP 表示使用四舍五入的方式进行舍入
// 底层存储模式:
// 把数据看成字符串,遍历得到里面的每一个字符,把这些字符在ASCII码表上的值,都存储到数组中。
// 如"0.226"在底层存的是[48, 46, 50, 50, 54],是0.226所对应的ASCII码值
}
}
原文地址:https://blog.csdn.net/Aishangyuwen/article/details/140621804
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!