java BigDecimal

本文介绍如何使用Java的BigDecimal类进行精确的数学运算,包括向上取整、向下取整、四舍五入及去除尾随零等操作。通过具体的代码示例,展示了BigDecimal在处理浮点数运算时的优势。

控制精度:

BigDecimal num = sum.divide(d, 0, BigDecimal.ROUND_UP);向上取整,精度为。

BigDecimal s = sum.divide(d,0,BigDecimal.ROUND_DOWN);向下取整,精度为0。

取余:

java.math.BigDecimal.remainder(BigDecimal divisor);

具体实现:

import java.util.*;
import java.io.*;
import java.math.*;
public class Main{

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext())
		{
			BigDecimal sum = sc.nextBigDecimal();
			BigDecimal d = sc.nextBigDecimal();
			BigDecimal num = sum.divide(d, 0, BigDecimal.ROUND_UP);
			BigDecimal s = sum.divide(d,0,BigDecimal.ROUND_DOWN);
			BigDecimal ans = new BigDecimal(0);
			for(int i = 1;;i++)
			{
				s = s.subtract(new BigDecimal(i));
				if(s.compareTo(new BigDecimal(0)) <= 0)
				{
					break;
				}
				num = num.add(new BigDecimal(1));
			}
			System.out.println(num);
		}
	}
}

去掉无效数字:

BigDecimal.stripTrailingZeros().toPlainString()

具体实现:

import java.util.*;
import java.io.*;
import java.math.*;
public class Main {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(sc.hasNext())
		{
			BigDecimal a = sc.nextBigDecimal();
			BigDecimal b = sc.nextBigDecimal();
			BigDecimal c = a.add(b);
			System.out.println(c.stripTrailingZeros().toPlainString());	
		}
	}
}
   System.out.println("四舍五入取整:(2)=" + new BigDecimal("2").setScale(0, BigDecimal.ROUND_HALF_UP)); 
   System.out.println("四舍五入取整:(2.1)=" + new BigDecimal("2.1").setScale(0, BigDecimal.ROUND_HALF_UP)); 
   System.out.println("四舍五入取整:(2.5)=" + new BigDecimal("2.5").setScale(0, BigDecimal.ROUND_HALF_UP)); 
   System.out.println("四舍五入取整:(2.9)=" + new BigDecimal("2.9").setScale(0, BigDecimal.ROUND_HALF_UP));

   System.out.println("四舍五入取整:(-2)=" + new BigDecimal("-2").setScale(0, BigDecimal.ROUND_HALF_UP)); 
   System.out.println("四舍五入取整:(-2.1)=" + new BigDecimal("-2.1").setScale(0, BigDecimal.ROUND_HALF_UP)); 
   System.out.println("四舍五入取整:(-2.5)=" + new BigDecimal("-2.5").setScale(0, BigDecimal.ROUND_HALF_UP)); 
   System.out.println("四舍五入取整:(-2.9)=" + new BigDecimal("-2.9").setScale(0, BigDecimal.ROUND_HALF_UP));

四舍五入取整:(2)=2
四舍五入取整:(2.1)=2
四舍五入取整:(2.5)=3
四舍五入取整:(2.9)=3

四舍五入取整:(-2)=-2
四舍五入取整:(-2.1)=-2
四舍五入取整:(-2.5)=-3
四舍五入取整:(-2.9)=-3

String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好 等于预期的 0.1。因此,比较而言,通常建议优先使用String 构造方法。

当 double 必须用作 BigDecimal 的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用 Double.toString(double) 方法,然后使用 BigDecimal(String) 构造方法,将 double 转换为 String。要获取该结果,请使用 static valueOf(double) 方法。

所以构造时尽量用 string。





### Java 中 `BigDecimal` 的使用方法 #### 创建 `BigDecimal` 创建 `BigDecimal` 对象有多种方式,最推荐的方式是从字符串构建: ```java BigDecimal valueFromString = new BigDecimal("123.45"); ``` 这种方式可以避免浮点数精度丢失的问题[^2]。 #### 基本算术操作 ##### 加法 通过调用 `add()` 方法实现加法运算: ```java BigDecimal sum = b1.add(b2); System.out.println("相加:" + sum); // 结果为 3 ``` ##### 减法 利用 `subtract()` 方法执行减法计算: ```java BigDecimal difference = b2.subtract(b1); System.out.println("相减:" + difference); // 结果为 1 ``` ##### 乘法 乘法可以通过 `multiply()` 完成: ```java BigDecimal product = b2.multiply(b3); System.out.println("相乘:" + product); // 结果为 8 ``` ##### 除法 对于除法,需要注意的是当无法整除时可能会抛出异常。因此建议指定舍入模式来处理这种情况: ```java // 设置精确度并采用四舍五入策略 BigDecimal quotient = b2.divide(b3, 2, RoundingMode.HALF_UP); System.out.println("相除:" + quotient); // 结果约为 0.50 ``` #### 比较大小 要获取两个数值中的较大者可使用 `max()` 方法;同样地,如果想要找到较小的那个则应该选用 `min()`: ```java BigDecimal num = new BigDecimal("3"); BigDecimal num1 = new BigDecimal("4"); // 获取两者之间的最大值 BigDecimal maxValue = num.max(num1); // 获取最小值的方法与此类似 BigDecimal minValue = num.min(num1); ``` #### 处理空指针异常 为了避免因传入 null 参数而导致程序崩溃,在进行任何运算前都应先验证对象是否为空: ```java if (bigDecimal != null && anotherBigDecimal != null){ bigDecimal.add(anotherBigDecimal); } else { throw new IllegalArgumentException("参数不能为空!"); } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值