Java Top.

开始使用Spring 5和Spring Boot 2,通过学习春天课程:

>>查看课程

1.概述

在本教程中,我们将对此进行演示大二世BigInteger课程。

我们将描述这两种数据类型、它们的特征以及它们的使用场景。我们还将简要介绍使用这两个类的各种操作。

2.大二世

大二世表示不可变的任意精度带符号的十进制数。它由两部分组成:

  • Unscaled Value - 任意精度整数
  • Scale—一个32位整数,表示小数点右边的位数

例如,大二世3.14具有314的未划算值和2。

我们用大二世高精度算术。我们还将其用于计算需要控制规模和舍入行为的计算。其中一个例子是涉及金融交易的计算。

我们可以创建一个大二世对象字符串,字符阵列,,, 和BigInteger:

@Test public void whenBigDecimalCreated_thenValueMatches() {BigDecimal bdFromString = new BigDecimal("0.1");bdFromCharArray = new BigDecimal(新char[]{' 3 ', '。',' 1 ',' 6 ',' 1 ',' 5 '});BigDecimal bdlFromInt = new BigDecimal(42);BigDecimal bdFromLong = new BigDecimal(123412345678901L);BigInteger BigInteger = BigInteger。probablePrime(100年,新的随机());BigDecimal bdFromBigInteger = new BigDecimal(bigInteger);assertequal(“0.1”,bdFromString.toString ());assertequal(“3.1615”,bdFromCharArray.toString ());assertequal(“42”,bdlFromInt.toString ());assertequal(“123412345678901”,bdFromLong.toString ()); assertEquals(bigInteger.toString(),bdFromBigInteger.toString()); }

我们还可以创建大二世:

@test public vod whigdecimalcreatedfromdouble_thenvaluemaynotmatch(){bigdecimal bdfromdouble = new bigdecimal(0.1d);assertnotequals(“0.1”,bdfromdouble.tostring());}

然而,在本例中,结果与预期不同(即0.1)。这是因为:

  • 构造函数进行精确的翻译
  • 中没有精确的表示

所以,我们应该使用s特林构造函数而不是构造函数

此外,我们可以转换BigInteger使用返回对象的值静态方法:

@Test public void whenBigDecimalCreatedUsingValueOf_thenValueMatches() {BigDecimal bdFromLong1 = BigDecimal. valueof (123412345678901L);bdFromLong2 = BigDecimal。返回对象的值(123412345678901 l, 2);bdFromDouble = BigDecimal. valueof (0.1d);assertequal(“123412345678901”,bdFromLong1.toString ());assertequal(“1234123456789.01”,bdFromLong2.toString ());assertequal(“0.1”,bdFromDouble.toString ());}

这种方法转换对其字符串转换为大二世。此外,它可以重用对象实例。

因此,我们应该使用返回对象的值方法优先于构造函数

3.上的操作大二世

就像其他的一样数量课程(整数,,双倍的等等。),大二世提供算术和比较操作的操作。它还提供了缩放操作、舍入和格式转换的操作。

它不会重载算术(+、-、/、*)或逻辑(>)。<等)操作符。相反,我们使用相应的方法-添加,减去,,compareTo。

大二世具有提取各种属性的方法,例如精度,缩放和标志:

@Test public void whenGettingAttributes_thenExpectedResult() {BigDecimal bd = new BigDecimal("-12345.6789");assertequal (9, bd.precision ());assertequal (4, bd.scale ());assertequal (bd.signum ());}

方法比较两个bigdecimal的值相比于方法:

@Test public void whenComparingBigDecimals_thenExpectedResult() {BigDecimal bd1 = new BigDecimal("1.0");BigDecimal bd2 = new BigDecimal("1.00");BigDecimal bd3 = new BigDecimal("2.0");assertTrue (bd1.compareTo (bd3) < 0);assertTrue (bd3.compareTo(1型)> 0);assertTrue (bd1.compareTo (bd2) = = 0);assertTrue (bd1.compareTo (bd3) < = 0);assertTrue (bd1.compareTo (bd2) > = 0);assertTrue (bd1.compareTo (bd3) ! = 0);}

此方法在比较时忽略刻度。

另一方面,等于方法考虑两个大二世对象只有在值和规模相等时才视为相等。因此,bigdecimal用这种方法比较,1.0和1.00不相等。

@Test public void whenEqualsCalled_thenSizeAndScaleMatched() {BigDecimal bd1 = new BigDecimal("1.0");BigDecimal bd2 = new BigDecimal("1.00");assertFalse (bd1.equals (bd2));}

我们通过调用相应的方法来执行算术运算:

@Test public void whenperformingarithme_thenexpectedresult () {BigDecimal bd1 = new BigDecimal("4.0");BigDecimal bd2 = new BigDecimal("2.0");BigDecimal sum = bd1.add(bd2);BigDecimal difference = bd1.subtract(bd2);BigDecimal商= bd1.divide(bd2);BigDecimal product = bd1.multiply(bd2);assertTrue(sum.compareTo(new BigDecimal("6.0")) == 0);assertTrue(difference.compareTo(new BigDecimal("2.0")) == 0);assertTrue(quotient.compareTo(new BigDecimal("2.0")) == 0);assertTrue(product.compareTo(new BigDecimal("8.0")) == 0); }

自从大二世是不可变的,这些操作不会修改现有对象。相反,他们返回新对象。

4.舍入和大二世

通过舍入一个数字,我们用另一个更短、更简单、更有意义的表示来代替它。例如,我们将$24.784917舍入为$24.78,因为我们没有小数。

要使用的精度和舍入模式取决于计算。例如,美国联邦纳税申报表指定了使用的全部美元金额half_up.

有两种控制舍入行为 -圆形码头MathContext

枚举圆形码头提供八种圆形模式:

  • 天花板,向正无穷四舍五入
  • 地面 -向负无穷四舍五入
  • 向上 -距离零
  • 下来,轮为零
  • HALF_UP -向“最近的邻居”舍入,除非两个邻居距离相等,在这种情况下舍入向上
  • 半决 -向“最近的邻居”四舍五入,除非两个邻居距离相等,在这种情况下四舍五入
  • HALF_EVEN -向“最近的邻居”四舍五入,除非两个邻居的距离相等,在这种情况下,向偶数邻居四舍五入
  • 不必要 -不需要舍入ArithmeticException如果没有确切的结果是可能的

HALF_EVEN舍入模式使舍入操作产生的偏差最小化。它经常被使用。它也被称为银行家的舍入

MathContext封装精度和舍入模式。很少有预定义的mathcontexts:

  • DECIMAL32- 7位精度和舍入模式的HALF_EVEN
  • DECIMAL64- 16位精度和HALF_EVEN舍入模式
  • DECIMAL128- 34位精度和HALF_EVEN的舍入模式
  • 无限的- 无限精度算术

使用这一课程,我们可以围绕一个大二世使用指定精度和舍入行为的数字:

@test公共vod whisRoundingdecimal_thenexpectedresult(){bigdecimal bd = new bigdecimal(“2.5”);//使用halfdecimal舍入= bd .round(新的MathContext(1,roundingMode.half_even))舍入到1位数。assertequals(“2”,圆形.Tostring());}

现在,让我们使用一个示例计算来检查舍入概念。

让我们编写一种方法来计算给定数量和单价的项目支付的总金额。我们还申请折扣率和销售税率。我们使用的是,我们将最终结果绕过美分setScale.方法:

公共静态大型大型计算(大量数量,BigDecimal UnitPrice,Bigdecimal Discontrate,Bigdecimal Taxrate){BigDecal金额=数量.Multiply(UnitPrice);BigDecimal折扣=金额.Multiply(Discountrate);BigDecimal折扣Damount =金额.subtract(折扣);Bigdecimal Tax =折扣丹Lamout.multiply(划绳);BigDecimal Total =折扣Damount.add(税);//使用half_even bigdecimal roundedtotal = total.setscale(2,roundingmode.half_even)舍入到2个小数点。返回圆形小莲;}

现在,让我们为此方法写一个单元测试:

@Test public void givenPurchaseTxn_whenCalculatingTotalAmount_thenExpectedResult() {BigDecimal quantity = new BigDecimal("4.5");BigDecimal unitPrice = new BigDecimal(“2.69”);BigDecimal discounate = new BigDecimal("0.10");BigDecimal taxRate = new BigDecimal("0.0725");BigDecimal amountToBePaid = BigDecimalDemo .calculateTotalAmount(数量,单价,折扣,税率);assertequal(“11.68”,amountToBePaid.toString ());}

5.BigInteger

BigInteger表示不可变的任意精度整数。它类似于原始整数类型,但允许任意大的值。

当涉及的整数大于的限制时使用类型。例如,50的因子是30414093201713378043612608166064768844377641568960512000000000000。这个值对于an来说太大了int或long要处理的数据类型。它只能存储在BigInteger变量。

它广泛用于安全性和加密应用。

我们可以创建BigInteger来自A.字节阵列或字符串:

@Test public void whenBigIntegerCreatedFromConstructor_thenExpectedResult() {BigInteger biFromString = new BigInteger(“1234567890987654321”);BigInteger biFromByteArray = new BigInteger(new byte[] {64, 64, 64, 64, 64, 64});BigInteger bifromsignamplitude = new BigInteger(-1, new byte[] {64, 64, 64, 64, 64, 64});assertequal(“1234567890987654321”,biFromString.toString ());assertequal(“70644700037184”,biFromByteArray.toString ());assertequal(“-70644700037184”,biFromSignMagnitude.toString ());}

此外,我们可以转换aBigInteger使用静态方法返回对象的值:

@Test public void whenLongConvertedToBigInteger_thenValueMatches() {BigInteger bi = BigInteger. valueof (2305843009213693951L);assertequal(“2305843009213693951”,bi.toString ());}

6.上的操作BigInteger

如同,BigInteger实现所有的算术和逻辑操作。但是,它不会重载操作符。

它还实现了相应的方法数学类:腹肌,最小值,最大限度,战俘,

类比较两个BigIntegers的值相比于方法:

@Test public void givenBigIntegers_whentCompared_thenExpectedResult() {BigInteger i = new BigInteger("123456789012345678901234567890");BigInteger j = new BigInteger("123456789012345678901234567891");BigInteger k = new BigInteger("123456789012345678901234567892");assertTrue (i.compareTo (i) = = 0);assertTrue (j.compareTo(我)> 0);assertTrue (j.compareTo (k) < 0);}

我们通过调用相应的方法来执行算术运算:

@test public voidedBigIntegers_WhenperFormingArithic_ThenExpedResult(){biginteger i = new biginteger(“4”);Biginteger J =新的Biginteger(“2”);BIGINTEGER SUM = i.ADD(j);Biginteger差异= I.Subtract(j);Biginteger Quotience = I.Divide(J);Biginteger产品= i.multiply(j);assertequals(新的Biginteger(“6”),总和);assertequals(新的Biginteger(“2”),差异);assertequals(新的Biginteger(“2”),商品);assertequals(新的Biginteger(“8”),产品); }

作为BigInteger是不可变的,这些操作不会修改现有对象。不同的是,,这些操作不会溢出。

BigInteger位操作类似吗。但是,我们需要使用方法而不是运算符:

@test public void给genigintegers_whenperformingbitoperations_thenexpectedresult(){biginteger i = new biginteger(“17”);Biginteger J =新的Biginteger(“7”);biginteger和= i.and(j);biginteger或= i.or(j);biginteger not = j.not();biginteger xor = i.xor(j);Biginteger Andnot = i.andnot(j);Biginteger Shiftleft = I.Shiftleft(1);biginteger shiftright = i.shiftright(1);assertequals(新的Biginteger(“1”)和); assertEquals(new BigInteger("23"), or); assertEquals(new BigInteger("-8"), not); assertEquals(new BigInteger("22"), xor); assertEquals(new BigInteger("16"), andNot); assertEquals(new BigInteger("34"), shiftLeft); assertEquals(new BigInteger("8"), shiftRight); }

它有额外的位操作方法:

@test public voidedBigintegers_whenperformingBitManipulations_thenexpedResult(){biginteger i = new biginteger(“1018”);int bitcount = i.bitcount();int bitlength = i.bitlength();int getlowestsetbit = i.getlowestsetbit();布尔testbit3 = i.testbit(3);BigInteger SetBit12 = I.Setbit(12);biginteger flipbit0 = i.flipbit(0);BigInteger ClearBit3 = I.Clearbit(3);assertequals(8,bitcount);assertequals(10,比特长); assertEquals(1, getLowestSetBit); assertEquals(true, testBit3); assertEquals(new BigInteger("5114"), setBit12); assertEquals(new BigInteger("1019"), flipBit0); assertEquals(new BigInteger("1010"), clearBit3); }

BigInteger提供了GCD计算和模块化算法的方法:

@Test public void givenBigIntegers_whenModularCalculation_thenExpectedResult() {BigInteger i = new BigInteger(“31”);BigInteger j = new BigInteger("24");BigInteger k = new BigInteger("16");BigInteger gcd = j.gcd(k);BigInteger multiplyAndmod = j.multiply(k).mod(i);BigInteger modInverse = j.modInverse(i);BigInteger modPow = j.modPow(k, i);先导入BigInteger(“8”assertequal(新),肾小球囊性肾病);先导入BigInteger (12), assertequal(新multiplyAndmod);先导入BigInteger (22), assertequal(新modInverse); assertEquals(new BigInteger("7"), modPow); }

它还具有与素生成和原始测试相关的方法:

@Test public void givenBigIntegers_whenPrimeOperations_thenExpectedResult() {BigInteger i = BigInteger。probablePrime(100年,新的随机());boolean isProbablePrime = i.isProbablePrime(1000);assertequal(真的,isProbablePrime);}

7.结论

在这个快速教程中,我们研究了这些类大二世Biginteger。在基本整数类型无法满足的高级数值计算中,它们是有用的。

和往常一样,可以找到完整的源代码在GitHub

Java底部

开始使用Spring 5和Spring Boot 2,通过学习春天课程:

>>查看课程
对这篇文章的评论关闭!