java Decimal(BigDecimal、BigInteger)总结

博客指出Decimal基本类计算小数点不够精确,介绍了BigDecimal类,它可解决Java中浮点型精度丢失问题,适用于高精度计算如金融计算,还列举了其四则运算方法;同时提到BigInteger可表示任意大的整数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Decimal基本类计算小数点不够精确

BigDecimal类

    解决Java中浮点型的精度丢失问题,是为了更精确计算小数
    在一些需要高精度计算的问题,比如金融里面的钱的计算,推荐使用BigDecimal
    public BigDecimal add(BigDecimal augend)
    public BigDecimal subtract(BigDecimal subtrahend)
    public BigDecimal multiply(BigDecimal multiplicand)
    public BigDecimal divide(BigDecimal divisor)

package com.gx.commonclass;

import java.math.BigDecimal;
/**
 * BigDecimal类
 * @author en
 *
 */
public class BigDecimalDemo {
	public static void main(String[] args) {
		
		demo2();
		
		 
	}
	
	public static void demo2(){ 
		Double DB=(double)(0.06000000000000000) + (double)(0.01000000000000000);
		
		
		//浮点型的精度丢失问题      
		System.out.println("0.06 + 0.01 = " + (0.06001 + 0.01));
		System.out.println("1.0 - 0.38 = " + (1.0 - 0.33));
		System.out.println("4.015 * 100 = " + (4.015 * 100));
		System.out.println("1123.3 / 100 = " + (1123.3 / 100));
		
		
		BigDecimal f1 = new BigDecimal("0.05");//推荐使用
		BigDecimal f2 = BigDecimal.valueOf(0.05);//推荐使用
		BigDecimal f3 = new BigDecimal(0.05);//不推荐使用
		System.out.println("f1 = "+f1);
		System.out.println("f2 = "+f2);
		System.out.println("f3 = "+f3);
		
		System.out.println("使用String作为BigDecimal构造器参数:");
		System.out.println("0.05 + 0.05 = " + f1.add(f2));// +
		System.out.println("0.05 - 0.05 = " + f1.subtract(f2));// -
		System.out.println("0.05 * 0.05 = " + f1.multiply(f2));// *
		System.out.println("0.05 / 0.05 = " + f1.divide(f2));// /
		System.out.println("0.05 ^ 2 = " + f1.pow(2));
		System.out.println("b1%b2="+f1.remainder(f2)); //取余
		
		System.out.println("使用double作为BigDecimal构造器参数:");
		System.out.println("0.05 + 0.05 = " + f3.add(f2));
		System.out.println("0.05 - 0.05 = " + f3.subtract(f2));
		System.out.println("0.05 * 0.05 = " + f3.multiply(f2));
		System.out.println("0.05 / 0.05 = " + f3.divide(f2));
		System.out.println("0.05 ^ 2 = " + f3.pow(2));
	}
	
	public static void demo1(){

		BigDecimal b1=new BigDecimal("27");
		BigDecimal b2=new BigDecimal(3);
		BigDecimal b3=BigDecimal.valueOf(15.8);
		
		System.out.println("b1+b2="+b1.add(b2)); //加
		System.out.println("b1-b2="+b1.subtract(b2)); //减
		System.out.println("b1*b2="+b1.multiply(b2)); //乘
		System.out.println("b1/b2="+b1.divide(b2)); //除
		System.out.println("b1%b2="+b1.remainder(b2)); //取余
		
		BigDecimal[] bigDecimals=b1.divideAndRemainder(b2);//除和取余
		for (BigDecimal bigDecimal : bigDecimals) {
			System.out.print(bigDecimal+",");
		}
		System.out.println();
		
		System.out.println("b1^3="+b1.pow(3));//n次方
		System.out.println("|b1|="+b1.abs());//绝对值
		System.out.println("-b1="+b1.negate());// this*-1
		System.out.println("b1取符号  "+b1.signum());//取符号位--》1为正数 0为零 -1为负数
		System.out.println(b1.max(b2));//获取b1、b2中最大的值
		System.out.println(b1.min(b2));//获取b1、b2中最小的值
		
		//BigDecimal转换成浮点型
		float f1=b1.floatValue();
		double d1=b1.doubleValue();
		
		System.out.println(b3);
		System.out.println(d1);
		System.out.println(f1);
	}
	
}

BigInteger

任意大的整数,原则上是,只要你的计算机的内存足够大,可以有无限位的(只能写整数)

package com.gx.commonclass;

import java.math.BigInteger;

/**
 * BigInteger 
 * 
 * @author en
 * 
 */
public class BigIntegerDemo {
	public static void main(String[] args) {
		BigInteger b1 = new BigInteger("100");
		BigInteger b2 = new BigInteger("36");
		BigInteger b3 = BigInteger.valueOf(25L);
		BigInteger b4 = BigInteger.TEN;
		System.out.println(b4);

		 System.out.println("b1+b2="+b1.add(b2)); //+
		 System.out.println("b1-b2="+b1.subtract(b2)); //-
		 System.out.println("b1*b2="+b1.multiply(b2)); //*
		 System.out.println("b1/b2="+b1.divide(b2)); //除
		BigInteger[] arr = b1.divideAndRemainder(b2); // 商和余数
		System.out.println("b1/b2="+arr[0]);
		System.out.println("b1%b2="+arr[1]);
		System.out.println("b1%b2="+b1.remainder(b3));// 取余
		System.out.println("b1^2="+b1.pow(2));// 2次方
		System.out.println("b1和b2的最大公约数="+b1.gcd(b2));// 公约数
		System.out.println("|b1|="+b1.abs());// 绝对值
		System.out.println("-b1="+b1.negate());// 取负数 <==>*-1
		System.out.println("b1符号:"+b1.signum());// 符号函数 1 0 -1
		//
		b1=BigInteger.valueOf(4);
		b2=BigInteger.valueOf(1);
		System.out.println(b1.and(b2));// 且
		System.out.println(b1.or(b2));// 或
		System.out.println(b1.xor(b2));// 异或
		System.err.println(b1.not());// 非
		
		
		/**
		 * 如果此 BigInteger 可能为素数,则返回 true,如果它一定为合数,则返回 false。如果 certainty <= 0,则返回 true。
		 * 
		 * 参数:
		 * 
		 * certainty - 调用方允许的不确定性的度量。如果该调用返回 true,则此 BigInteger 是素数的概率超出 (1 - 1/2certainty)。此方法的执行时间与此参数的值是成比例的。
		 * 
		 * 返回:
		 * 
		 * 如果此 BigInteger 可能为素数,则返回 true,如果它一定为合数,则返回 false。
		 */
		System.out.println(b1.isProbablePrime(2));
		
		System.out.println(b1.max(b2));
		System.out.println(b1.min(b2));
		
		//转换成int  溢出
		b1=BigInteger.valueOf(100);
		System.out.println(b1.pow(818));
		System.out.println("===>"+b1.pow(18).intValue());
	}
}

 

Java 中,`BigDecimal` 类提供了一种精确表示十进制数的方式,并支持各种算术运算。如果需要将 `BigDecimal` 转换为 `Integer`,可以使用其内置方法 `intValue()` 或者更安全地结合其他操作(如取舍模式)完成。 以下是常见的几种方式: --- ### **1. 使用 intValue()** 这是最直接的方法,它会丢弃小数部分并返回整数值。 ```java BigDecimal bigDecimal = new BigDecimal("123.45"); int result = bigDecimal.intValue(); // 结果为 123 ``` 注意:此方法不会抛出异常,但如果数据有溢出风险,则可能导致结果不符合预期。 --- ### **2. 强制四舍五入后再转换** 为了避免精度丢失的问题,在转换前可以先对值进行四舍五入处理: ```java BigDecimal bigDecimal = new BigDecimal("123.78"); int result = bigDecimal.setScale(0, RoundingMode.HALF_UP).intValue(); // 结果为 124 ``` 这里我们通过 `setScale(0, RoundingMode.HALF_UP)` 指定保留零位小数点并将多余的部分按“半进一”规则舍去。 --- ### **3. 使用 toBigInteger().intValue()** 对于非常大的数字或者负指数情况下的 BigDecimal 值来说,这种方式更为稳健一些因为它首先尝试把该数值转成 BigInteger 对象然后再进一步转化为 int 形式。 ```java BigDecimal bigDecimal = new BigDecimal("99999999999"); int result = bigDecimal.toBigInteger().intValue(); // 需要注意可能发生的截断现象 ``` **注意事项**: 如果原始的大数超出了 Integer 的范围 [-2^31 到 (2^31)-1] ,那么最终的结果可能会被裁剪掉高位信息只留下低几位有效内容。 --- #### 示例完整代码片段 下面是一个完整的示例程序展示了上述三种技巧的应用场景: ```java public class Main { public static void main(String[] args) { BigDecimal decimalValue = new BigDecimal("123.6"); // 方案 1 - 简单 truncate 小数部分 System.out.println(decimalValue.intValue()); // 方案 2 - 四舍五入后获取 integer System.out.println(decimalValue.setScale(0,BigDecimal.ROUND_HALF_UP).intValue()); // 方案 3 - 先变更为 BigInteger 再缩小至 Int if (!decimalValue.scale()>0 && !decimalValue.compareTo(BigDecimal.ZERO)<0 ){ try{ System.out.println(decimalValue.toBigIntegerExact().intValue()); }catch(ArithmeticException e){ // 当无法准确表示为integer时触发错误 System.err.println(e.getMessage()); } } } } ``` ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值