Guava中的数学
数学处理有很多种方式,JDK里面也为我们提供相应的方法,为什么这里我们需要使用Guava里面方法呢?主要由以下几点原因:
- Guava Math针对各种不常见的溢出情况都有充分的测试;对溢出语义,Guava文档也有相应的说明;如果运算的溢出检查不能通过,将导致快速失败;
- Guava Math的性能经过了精心的设计和调优;虽然性能不可避免地依据具体硬件细节而有所差异,但Guava Math的速度通常可以与Apache Commons的MathUtils相比,在某些场景下甚至还有显著提升;
- Guava Math在设计上考虑了可读性和正确的编程习惯;
IntMath.log2(x, CEILING)
所表达的含义,即使在快速阅读时也是清晰明确的。而32-Integer.numberOfLeadingZeros(x – 1)
对于阅读者来说则不够清晰。
数学工具类使用实例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62
| package com.qinjiangbo;
import com.google.common.math.BigIntegerMath; import com.google.common.math.DoubleMath; import com.google.common.math.IntMath; import org.junit.Test;
import java.math.BigInteger; import java.math.RoundingMode;
public class MathTest {
@Test public void testSqrt() { System.out.println(IntMath.sqrt(26, RoundingMode.DOWN)); }
@Test public void testFactorial() { System.out.println(DoubleMath.factorial(10)); }
@Test public void testMean() { System.out.println(DoubleMath.mean(10, 276, 89, 46, 59)); }
@Test public void testDivide() { System.out.println(IntMath.divide(10, 3, RoundingMode.UP)); }
@Test public void testGcd() { System.out.println(IntMath.gcd(60, 24)); }
@Test public void testMod() { System.out.println(IntMath.mod(192, 54)); }
@Test public void testPow() { System.out.println(IntMath.pow(2, 10)); }
@Test public void testIsPowerOfTwo() { System.out.println(IntMath.isPowerOfTwo(36)); }
@Test public void testBinomial() { System.out.println(IntMath.binomial(10, 4)); }
}
|
总结
上面的代码中方法名称是自解释型的,读者朋友可以自己查看这些代码来体会Guava是如何来处理数学中的常见运算的。