专栏首页麦洛的历劫之路Java中的数学运算BigDecimal

Java中的数学运算BigDecimal

前言:

最近在项目中碰到了根据公式算法的需求,今天来一起学习下Java中的数学运算

Math类

package ch7;

/**
 * Created by Jiqing on 2016/11/24.
 */
public class MathDemo {
    public static void main(String[] args) {
        /* 取整运算 */
        // 返回小于目标数的最大整数
        System.out.println("Math.floor(-1.2):"+Math.floor(-1.2)); // -2.0

        // 返回大于目标数的最小整数
        System.out.println("Math.ceil(1.2):"+Math.ceil(1.2)); // 2.0

        // 四舍五入取整
        System.out.println("Math.round(2.3):" +Math.round(2.3)); // 2

        /* 大小相关计算 */
        // 找出最大值
        System.out.println("Math.max(2.3,4.5):"+Math.max(2.3,4.5)); // 4.5
        // 找出最小值
        System.out.println("Math.min(2.3,4.5):"+Math.min(2.3,4.5)); // 2.3
        // 返回一个随机数0~1之间
        System.out.println("Math.random():"+Math.random());
    }
} 

BigDecimal

package ch7;

import java.math.BigDecimal;

/**
 * Created by Jiqing on 2016/11/24.
 */
public class BigDecimalDemo {
    public static void main(String[] args) {
        // float、double容易精度丢失
        System.out.println("0.05 + 0.01 = " + (0.05 + 0.01)); //0.060000000000000005
        System.out.println("1.0 - 0.42 = " + (1.0 - 0.42)); //0.5800000000000001
        System.out.println("4.015 * 100 = " + (4.015 * 100)); // 401.49999999999994
        System.out.println("123.3 / 100 = " + (123.3 / 100)); // 1.2329999999999999

        // BigDecimal解决精度问题
        BigDecimal f1 = new BigDecimal("0.05"); // 使用String作为构造器参数
        BigDecimal f2 = BigDecimal.valueOf(0.01);
        BigDecimal f3 = new BigDecimal(0.05); // 使用double作为构造器参数

        System.out.println("使用String作为BigDecimal构造器参数:");
        System.out.println("0.05 + 0.01 = " + f1.add(f2));
        System.out.println("0.05 - 0.01 = " + f1.subtract(f2));
        System.out.println("0.05 * 0.01 = " + f1.multiply(f2));
        System.out.println("0.05 / 0.01 = " + f1.divide(f2));
        //使用String作为BigDecimal构造器参数:
        //0.05 + 0.01 = 0.06
        //0.05 - 0.01 = 0.04
        //0.05 * 0.01 = 0.0005
        //0.05 / 0.01 = 5

        System.out.println("使用double作为BigDecimal构造器参数:");
        System.out.println("0.05 + 0.01 = " + f3.add(f2));
        System.out.println("0.05 - 0.01 = " + f3.subtract(f2));
        System.out.println("0.05 * 0.01 = " + f3.multiply(f2));
        System.out.println("0.05 / 0.01 = " + f3.divide(f2));

        //使用double作为BigDecimal构造器参数:
        //0.05 + 0.01 = 0.06000000000000000277555756156289135105907917022705078125
        //0.05 - 0.01 = 0.04000000000000000277555756156289135105907917022705078125
        //0.05 * 0.01 = 0.0005000000000000000277555756156289135105907917022705078125
        //0.05 / 0.01 = 5.000000000000000277555756156289135105907917022705078125
    }
} 

衍生出来的工具类Arith

package ch7;

import java.math.BigDecimal;
import java.util.function.BinaryOperator;

/**
 * Created by Jiqing on 2016/11/24.
 */
public class Arith {
    // 进行精确计算的工具类
    // 默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;
    // 构造器私有,让这个类不能实例化
    private Arith() {}

    // 提供精确的加法运算
    public static double add(double v1,double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.add(b2).doubleValue();
    }

    // 提供精确减法运算
    public static double sub(double v1,double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.subtract(b2).doubleValue();
    }

    // 提供精确的乘法运算
    public static double mul(double v1,double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.multiply(b2).doubleValue();
    }

    // 提供相对精确的除法运算
    public static double div(double v1,double v2) {
        BigDecimal b1 = BigDecimal.valueOf(v1);
        BigDecimal b2 = BigDecimal.valueOf(v2);
        return b1.divide(b2,DEF_DIV_SCALE,BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    public static void main(String[] args) {
        System.out.println("0.05 + 0.01= " + Arith.add(0.05,0.01)); //0.05 + 0.01= 0.06
        System.out.println("1.0 - 0.42= " + Arith.sub(1.0,0.42)); //1.0 - 0.42= 0.58
        System.out.println("4.015 * 100= " + Arith.mul(4.015,100)); //4.015 * 100= 401.5
        System.out.println("123.3 / 1000= " + Arith.div(123.3,1000)); //123.3 / 1000= 0.1233
    }
}

本文分享自微信公众号 - 今日Java(JavaToday),作者:麦洛

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-02-26

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • java学习之路:24.大数字运算(BigInteger,BigDecimal)

    BigInteger类型的数字要比Integer类型的数字范围大得多,并且支持任意精度的整数,在运算中,BigInteger类型可以准确地表示任何大小的整数值而...

    花狗Fdog
  • Java中的BigDecimal类你了解多少?

    可以看到在Java中进行浮点数运算的时候,会出现丢失精度的问题。那么我们如果在进行商品价格计算的时候,就会出现问题。很有可能造成我们手中有0.06元,却无法购买...

    用户1516716
  • java保留两位小数

    四舍五入   double   f   =   111231.5585;   BigDecimal   b   =   new   BigDecimal(f...

    bear_fish
  • BigDecimal

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,...

    黑洞代码
  • Java-BigDecimal数据类型

    我们知道在Java中有float和double类型,它们的主要设计目标是为了科学计算和工程计算。然而,它们没有提供完全精确的结果【因为其有限的有效位数】,所以不...

    老九学堂-小师弟
  • 【答疑解惑】Java中的高精度数字

    前几天网友在群里有问BigDecimal能直接赋值吗?就像使用基本数据类型那样,答案是不能。 Java中的基本数据类型有的时候是不能满足实际编程需要的,特别是在...

    程序员互动联盟
  • 金融系统中正确的金额计算及存储方式

    昨天微信群里在讨论金额计算及存储的话题,今天特来结贴一下。 经典的精度丢失问题 Java中的类型float、double用来做计算会有精度丢失问题,下面来看下面...

    Java技术栈
  • 浮点型变量(float和double)和BigDecimal的使用

    带小数的变量在Java中称为浮点型,Java的浮点型有两种:float和double。

    硕人其颀
  • Java中的BigDecimal,你真的会用吗?

    Java在java.math包中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。双精度浮点型变量double可以处理16位有效数,...

    macrozheng

扫码关注云+社区

领取腾讯云代金券