原文链接 译文链接 译者:沈义扬
注意:Guava Math和GWT格外不兼容,这是因为Java和Java Script语言的运算溢出逻辑不一样。
Guava Math主要处理三种整数类型:int、long和BigInteger。这三种类型的运算工具类分别叫做IntMath、LongMath和BigIntegerMath。
Guava Math提供了若干有溢出检查的运算方法:结果溢出时,这些方法将快速失败而不是忽略溢出
IntMath.checkedAddLongMath.checkedAddIntMath.checkedSubtractLongMath.checkedSubtractIntMath.checkedMultiplyLongMath.checkedMultiplyIntMath.checkedPowLongMath.checkedPow IntMath.checkedAdd(Integer.MAX_VALUE, Integer.MAX_VALUE); // throws ArithmeticExceptionIntMath、LongMath和BigIntegerMath提供了很多实数运算的方法,并把最终运算结果舍入成整数。这些方法接受一个java.math.RoundingMode枚举值作为舍入的模式:
DOWN:向零方向舍入(去尾法)UP:远离零方向舍入FLOOR:向负无限大方向舍入CEILING:向正无限大方向舍入UNNECESSARY:不需要舍入,如果用此模式进行舍入,应直接抛出ArithmeticExceptionHALF_UP:向最近的整数舍入,其中x.5远离零方向舍入HALF_DOWN:向最近的整数舍入,其中x.5向零方向舍入HALF_EVEN:向最近的整数舍入,其中x.5向相邻的偶数舍入这些方法旨在提高代码的可读性,例如,divide(x, 3, CEILING) 即使在快速阅读时也是清晰。此外,这些方法内部采用构建整数近似值再计算的实现,除了在构建sqrt(平方根)运算的初始近似值时有浮点运算,其他方法的运算全过程都是整数或位运算,因此性能上更好。
运算 IntMath LongMath BigIntegerMath 除法divide(int, int, RoundingMode)divide(long, long, RoundingMode)divide(BigInteger, BigInteger, RoundingMode)2为底的对数log2(int, RoundingMode)log2(long, RoundingMode)log2(BigInteger, RoundingMode)10为底的对数log10(int, RoundingMode)log10(long, RoundingMode)log10(BigInteger, RoundingMode)平方根sqrt(int, RoundingMode)sqrt(long, RoundingMode)sqrt(BigInteger, RoundingMode) // returns 31622776601683793319988935444327185337195551393252 BigIntegerMath.sqrt(BigInteger.TEN.pow(99), RoundingMode.HALF_EVEN);Guava还另外提供了一些有用的运算函数
运算 IntMath LongMath BigIntegerMath* 最大公约数gcd(int, int)gcd(long, long)BigInteger.gcd(BigInteger)取模mod(int, int)mod(long, long)BigInteger.mod(BigInteger)取幂pow(int, int)pow(long, int)BigInteger.pow(int)是否2的幂isPowerOfTwo(int)isPowerOfTwo(long)isPowerOfTwo(BigInteger)阶乘*factorial(int)factorial(int)factorial(int)二项式系数*binomial(int, int)binomial(int, int)binomial(int, int)*BigInteger的最大公约数和取模运算由JDK提供
*阶乘和二项式系数的运算结果如果溢出,则返回MAX_VALUE
JDK比较彻底地涵盖了浮点数运算,但Guava在DoubleMath类中也提供了一些有用的方法。
isMathematicalInteger(double)判断该浮点数是不是一个整数roundToInt(double, RoundingMode)舍入为int;对无限小数、溢出抛出异常roundToLong(double, RoundingMode)舍入为long;对无限小数、溢出抛出异常roundToBigInteger(double, RoundingMode)舍入为BigInteger;对无限小数抛出异常log2(double, RoundingMode)2的浮点对数,并且舍入为int,比JDK的Math.log(double) 更快 文章转自 并发编程网-ifeve.com 相关资源:敏捷开发V1.0.pptx