码迷,mamicode.com
首页 > 其他好文 > 详细

BigInteger、BigDecimal

时间:2021-02-09 12:02:58      阅读:0      评论:0      收藏:0      [点我收藏+]

标签:数据   方式   string   image   ext   控制   方法   数字   建议   

在Java中,8种基本数据类型并不能表示所有的数字。

整数无法表示比byte最小取值还小的,比long最大取值还大的。

浮点数本身有精度,

这就注定有很多数字用基本类型没有办法表示。

BigInteger用来表示不可变的任意精度的整数。BigDecimal用来表示不可变的、任意精度的有符号十进制数。大数据的运算需要通过对应的方法。

 

BigInteger类有很多重载的构造方法,但一般采用字符串作为参数,其他类型如int所能表示的数字是有限的,而字符串可以是传入任意位的整数

做加减乘除运算依赖的方法分别是add subtract multiply divide

 

BigDecimal类也有很多重载的构造方法,但一般都采用字符串作为参数,这样参数结果是可以预知的。

尤其注意不可采用double作为参数的构造方法,因为double本身就是不精确的,导致此构造方法的结果有一定的不可预知性。

 

 如下以double作为参数的构造器,在API中也不建议使用

public BigDecimal(double val)
double 转换为 BigDecimal,后者是 double 的二进制浮点值准确的十进制表示形式。返回的 BigDecimal 的标度是使 (10scale × val) 为整数的最小值。

注:

  1. 此构造方法的结果有一定的不可预知性。有人可能认为在 Java 中写入 new BigDecimal(0.1) 所创建的 BigDecimal 正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于 0.1000000000000000055511151231257827021181583404541015625。这是因为 0.1 无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入 到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。
  2. 另一方面,String 构造方法是完全可预知的:写入 new BigDecimal("0.1") 将创建一个 BigDecimal,它正好 等于预期的 0.1。因此,比较而言,通常建议优先使用 String 构造方法
  3. double 必须用作 BigDecimal 的源时,请注意,此构造方法提供了一个准确转换;它不提供与以下操作相同的结果:先使用 Double.toString(double) 方法,然后使用 BigDecimal(String) 构造方法,将 double 转换为 String。要获取该结果,请使用 static valueOf(double) 方法。

 

BigDecima做加减乘除运算依赖的方法也是add subtract multiply divide

但对于浮点数据的除法运算,和整数不同,可能出现无限循环或无限不循环小数,因此需要对所需要的位数进行保留和选择舍入模式(无法表示确切的结果的话会抛出异常)

技术图片

 

 

  • BigDecimal类使其用户完全控制舍入行为。 如果未指定舍入模式,并且无法表示确切的结果,则抛出异常; 否则,可以通过向操作提供适当的MathContext对象来进行计算,以选择精度和舍入模式。 在这两种情况下,都提供八种舍入方式来控制舍入。 不建议使用此类中的整数字段(如ROUND_HALF_UP )表示舍入模式; 应该使用RoundingMode 枚举的枚举值(如RoundingMode.HALF_UP )。

 

BigInteger、BigDecimal

标签:数据   方式   string   image   ext   控制   方法   数字   建议   

原文地址:https://www.cnblogs.com/shizunatsu/p/14386008.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!