Java8: BigDecimal

 Java8:BigDecimal 转两位小数的百分数-CSDN博客

BigDecimal 先做除法 然后取绝对值

在Java 8中,如果你想要对一个BigDecimal值进行除法操作,并随后取其绝对值,你可以通过组合divide方法和abs方法来实现这一目的。不过,需要注意的是,divide方法可能会抛出ArithmeticException,如果除法的结果无法精确表示(比如,尝试除以0,或者结果的小数点后的位数超过了scale参数指定的位数,且没有指定舍入模式)。

以下是一个简单的示例,展示了如何对两个BigDecimal值进行除法操作,并取其结果的绝对值:

import java.math.BigDecimal;  
import java.math.RoundingMode;  
  
public class BigDecimalExample {  
    public static void main(String[] args) {  
        // 假设这是你的两个BigDecimal值  
        BigDecimal dividend = new BigDecimal("10.0");  
        BigDecimal divisor = new BigDecimal("3.0");  
  
        try {  
            // 执行除法操作,并设置舍入模式和scale  
            // 这里使用RoundingMode.HALF_UP(四舍五入)和scale为2(保留两位小数)  
            BigDecimal result = dividend.divide(divisor, 2, RoundingMode.HALF_UP);  
  
            // 取绝对值  
            BigDecimal absoluteResult = result.abs();  
  
            // 输出结果  
            System.out.println("原始结果: " + result);  
            System.out.println("绝对值结果: " + absoluteResult);  
  
        } catch (ArithmeticException e) {  
            // 处理可能出现的除数为0或其他算术异常  
            System.err.println("发生算术异常: " + e.getMessage());  
        }  
    }  
}

在这个例子中,我们首先通过divide方法对两个BigDecimal值进行除法操作,并指定了结果需要保留的小数位数(scale)和舍入模式(RoundingMode)。之后,我们使用abs方法获取了除法结果的绝对值。

请注意,根据你的具体需求,你可能需要调整scaleRoundingMode的值。scale参数定义了结果中小数点后的位数,而RoundingMode则定义了当结果无法精确表示时如何进行舍入。Java提供了多种舍入模式,如RoundingMode.HALF_UP(四舍五入)、RoundingMode.DOWN(向下舍入)、RoundingMode.UP(向上舍入)等。

BigDecimal 仅保留有效小数位

在Java中,BigDecimal 类提供了处理精确小数的功能,但直接保留“有效小数位”可能需要根据你的具体定义来操作,因为“有效小数位”这个概念不像四舍五入到固定小数位数那样直接。不过,我们可以通过一些方法来近似实现这一目标。

如果你的目标是去除末尾不必要的零(即保留有效数字),同时保证不超过某个小数位数(如果需要的话),你可以结合使用 stripTrailingZeros() 方法和 setScale() 方法(但后者在这里主要用于控制最大小数位数,如果不关心最大小数位数,则可以省略)。

以下是一个示例,展示了如何仅保留BigDecimal的有效小数位(并可选地限制最大小数位数):

import java.math.BigDecimal;  
import java.math.RoundingMode;  
  
public class BigDecimalExample {  
    public static void main(String[] args) {  
        // 示例BigDecimal值  
        BigDecimal number = new BigDecimal("123.4500");  
  
        // 仅保留有效小数位(去除末尾的0)  
        BigDecimal effectiveNumber = number.stripTrailingZeros();  
  
        // 如果需要限制最大小数位数,可以额外使用setScale方法  
        // 假设我们限制最大小数位数为2(这里实际上不需要,因为已经没有多余的0了)  
        // 注意:setScale可能会引入四舍五入,这里使用RoundingMode.DOWN避免不必要的四舍五入  
        BigDecimal effectiveNumberWithScale = effectiveNumber.setScale(2, RoundingMode.DOWN);  
  
        // 输出结果  
        System.out.println("原始值: " + number);  
        System.out.println("去除末尾0后的值: " + effectiveNumber);  
        System.out.println("限制最大小数位数后的值(如果需要): " + effectiveNumberWithScale);  
  
        // 对于更复杂的情况,比如小数部分很短但需要保留至少一位小数  
        BigDecimal shortDecimal = new BigDecimal("123.0");  
        BigDecimal shortDecimalEffective = shortDecimal.setScale(1, RoundingMode.HALF_UP); // 四舍五入到1位小数  
        System.out.println("短小数部分的值,保留1位小数: " + shortDecimalEffective);  
    }  
}

请注意,stripTrailingZeros() 方法会去除小数部分末尾的零,但不会改变整数值。如果你想要对整数部分也进行某种形式的“压缩”(比如去除不必要的零,尽管整数部分通常不这样处理),那么你可能需要自定义逻辑来处理这种情况,因为BigDecimal没有直接提供这样的方法。

此外,如果你想要确保结果总是至少有一位小数(即使它是零),你应该使用 setScale() 方法并指定最小的小数位数为1,同时根据需要选择合适的舍入模式。在上面的示例中,shortDecimalEffective 展示了如何对短小数部分的值进行四舍五入到1位小数。

toPlainString toString toEngineeringString

在Java的BigDecimal类中,toPlainString()toString()toEngineeringString()方法都用于将BigDecimal对象转换为字符串表示,但它们之间有一些关键的区别。

  1. toString()

    toString()方法是将BigDecimal转换为字符串的默认方式。它生成的字符串是科学计数法和非科学计数法的混合体,具体取决于数值的大小和精度。如果数值的绝对值小于10^7且大于或等于10^-3,则不使用科学计数法;否则,它可能会使用科学计数法。不过,这个阈值并不是绝对的,实际行为可能会因JDK版本和具体实现而异。

BigDecimal bd = new BigDecimal("123456789.123456789");  
System.out.println(bd.toString()); // 输出可能不是科学计数法,取决于数值

2、toPlainString()

toPlainString()方法总是返回不带科学计数法的字符串表示。无论数值的大小如何,它都会直接以数字的形式返回,不会包含任何指数部分。这对于需要精确控制数值显示格式的场景非常有用。

BigDecimal bd = new BigDecimal("1.23456789E7");  
System.out.println(bd.toPlainString()); // 输出: 12345678.9

注意:由于toPlainString()不会使用科学计数法,如果数值非常大或非常小,返回的字符串可能会很长。

3、toEngineeringString()
toEngineeringString()方法返回的是工程计数法的字符串表示。它根据数值的大小,以科学计数法的形式返回字符串,但指数必须是3的倍数(即10^n中的n是3的倍数),且小数部分至少有1位数字。这种表示法在某些工程和科学领域很有用,因为它提供了一种在保持可读性的同时,以紧凑方式表示大范围数值的方法。

 

BigDecimal bd = new BigDecimal("123456789.123456789");  
System.out.println(bd.toEngineeringString()); // 输出可能是: 123.456789123456789E6

 注意:由于toEngineeringString()使用科学计数法,并且指数是3的倍数,因此它可能不会返回与toString()或toPlainString()完全相同的字符串表示。

在选择使用哪个方法时,你应该根据你的具体需求来决定。如果你需要精确的数值表示,并且不关心是否使用科学计数法,那么toString()可能是最好的选择。如果你需要避免科学计数法,那么toPlainString()是更好的选择。而如果你需要以一种紧凑且易于阅读的方式表示大范围的数值,那么toEngineeringString()可能是最合适的。

--end--

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值