欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

java BigInteger大整数类 和 BigDecimal大浮点数类 解决大数问题 常用方法简单学习总结

程序员文章站 2022-07-15 12:28:26
...

BigInterger

构造方法

java BigInteger大整数类 和 BigDecimal大浮点数类 解决大数问题 常用方法简单学习总结

常用方法

java BigInteger大整数类 和 BigDecimal大浮点数类 解决大数问题 常用方法简单学习总结

静态方法

java BigInteger大整数类 和 BigDecimal大浮点数类 解决大数问题 常用方法简单学习总结

A+B 问题 hdu1002

import java.util.Scanner;
import java.math.BigInteger;
import java.math.BigDecimal;

public class Main {

    static Scanner sc = new Scanner( System.in );

    public static void main ( String[] args ) {
        int t = sc.nextInt();
        for ( int cas = 1; cas <= t; ++cas ) {
            
            BigInteger 
            sa = sc.nextBigInteger(),
            sb = sc.nextBigInteger();
            
            System.out.println( "Case "+cas+""+":" );
            System.out.println( 
                sa 
                +" + "+ 
                sb 
                +" = "+ 
                sa.add( sb ) );

            if ( cas!=t ) System.out.println();
        }

    }

}

BigDecimal

构造方法

java BigInteger大整数类 和 BigDecimal大浮点数类 解决大数问题 常用方法简单学习总结

常用方法

java BigInteger大整数类 和 BigDecimal大浮点数类 解决大数问题 常用方法简单学习总结

静态方法

精度控制问题

https://blog.csdn.net/well386/article/details/53945796

BigDecimal舍入模式

尽管数据库存储的是一个高精度的浮点数,但是通常在应用中展示的时候往往需要限制一下小数点的位数,比如两到三位小数即可,这时就需要使用到setScale(int newScale, int roundingMode)函数,作为BigDecimal的公有静态变量,舍入模式(Rounding Mode)的运算规则比较多,公有八种,这里作个说明,官方文档也有介绍。

ROUND_UP
向远离零的方向舍入。舍弃非零部分,并将非零舍弃部分相邻的一位数字加一。

ROUND_DOWN
向接近零的方向舍入。舍弃非零部分,同时不会非零舍弃部分相邻的一位数字加一,采取截取行为。

ROUND_CEILING
向正无穷的方向舍入。如果为正数,舍入结果同ROUND_UP一致;如果为负数,舍入结果同ROUND_DOWN一致。
注意:此模式不会减少数值大小。

ROUND_FLOOR
向负无穷的方向舍入。如果为正数,舍入结果同ROUND_DOWN一致;如果为负数,舍入结果同ROUND_UP一致。
注意:此模式不会增加数值大小。

ROUND_HALF_UP
向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。如果舍弃部分>= 0.5,
则舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。这种模式也就是我们常说的我们的“四舍五入”。

ROUND_HALF_DOWN
向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则为向下舍入的舍入模式。如果舍弃部分> 0.5,则
舍入行为与ROUND_UP相同;否则舍入行为与ROUND_DOWN相同。这种模式也就是我们常说的我们的“五舍六入”。

ROUND_HALF_EVEN
向“最接近”的数字舍入,如果与两个相邻数字的距离相等,则相邻的偶数舍入。如果舍弃部分左边的数字奇数,则
舍入行为与 ROUND_HALF_UP 相同;如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。
注意:在重复进行一系列计算时,此舍入模式可以将累加错误减到最小。此舍入模式也称为“银行家舍入法”,
主要在美国使用。四舍六入,五分两种情况,如果前一位为奇数,则入位,否则舍去。

ROUND_UNNECESSARY
断言请求的操作具有精确的结果,因此不需要舍入。如果对获得精确结果的操作指定此舍入模式,则
抛出ArithmeticException。

java BigInteger大整数类 和 BigDecimal大浮点数类 解决大数问题 常用方法简单学习总结
java BigInteger大整数类 和 BigDecimal大浮点数类 解决大数问题 常用方法简单学习总结

正确

BigDecimal decimal = new BigDecimal("12.12345");
decimal= decimal.setScale(2, RoundingMode.HALF_DOWN);
System.out.println(decimal);//取两个小数,四舍五入

错误

BigDecimal decimal = new BigDecimal("12.12345");
decimal.setScale(2, RoundingMode.HALF_DOWN);
System.out.println(decimal);

why?
因为setScale方法会返回一个新的BigDecimal对象,这个新对象才是我们需要的
可以输出一下两个BigDecimal对象的hashcode()

去掉后导零

BigDecimal bignum_a = new BigDecimal( "0.10000" );

// stripTrailingZeros() 是重新构造了一个 0.1 的 BigDecimal 对象, 需要指向这个对象完成赋值
bignum_a = bignum_a.stripTrailingZeros(); 

// 字符串的形式
String bignum_a_String = bignum_a.toPlainString();

文章参考