自学内容网 自学内容网

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)!