[Google Guava] 12-数学运算
范例
1 int logFloor = LongMath.log2(n, FLOOR);
2 int mustNotOverflow = IntMath.checkedMultiply(x, y);
3 long quotient = LongMath.divide(knownMultipleOfThree, 3, RoundingMode.UNNECESSARY); // fail fast on non-multiple of 3
4 BigInteger nearestInteger = DoubleMath.roundToBigInteger(d, RoundingMode.HALF_EVEN);
5 BigInteger sideLength = BigIntegerMath.sqrt(area, CEILING);
为什么使用Guava Math
- Guava Math针对各种不常见的溢出情况都有充分的测试;对溢出语义,Guava文档也有相应的说明;如果运算的溢出检查不能通过,将导致快速失败;
 - Guava Math的性能经过了精心的设计和调优;虽然性能不可避免地依据具体硬件细节而有所差异,但Guava Math的速度通常可以与Apache Commons的MathUtils相比,在某些场景下甚至还有显著提升;
 - Guava Math在设计上考虑了可读性和正确的编程习惯;IntMath.log2(x, CEILING) 所表达的含义,即使在快速阅读时也是清晰明确的。而32-Integer.numberOfLeadingZeros(x – 1)对于阅读者来说则不够清晰。
 
注意:Guava Math和GWT格外不兼容,这是因为Java和Java Script语言的运算溢出逻辑不一样。
整数运算
Guava Math主要处理三种整数类型:int、long和BigInteger。这三种类型的运算工具类分别叫做IntMath、LongMath和BigIntegerMath。
有溢出检查的运算
Guava Math提供了若干有溢出检查的运算方法:结果溢出时,这些方法将快速失败而不是忽略溢出
| IntMath.checkedAdd | LongMath.checkedAdd | 
| IntMath.checkedSubtract | LongMath.checkedSubtract | 
| IntMath.checkedMultiply | LongMath.checkedMultiply | 
| IntMath.checkedPow | LongMath.checkedPow | 
1 IntMath.checkedAdd(Integer.MAX_VALUE, Integer.MAX_VALUE); // throws ArithmeticException
实数运算
IntMath、LongMath和BigIntegerMath提供了很多实数运算的方法,并把最终运算结果舍入成整数。这些方法接受一个java.math.RoundingMode枚举值作为舍入的模式:
- DOWN:向零方向舍入(去尾法)
 - UP:远离零方向舍入
 - FLOOR:向负无限大方向舍入
 - CEILING:向正无限大方向舍入
 - UNNECESSARY:不需要舍入,如果用此模式进行舍入,应直接抛出ArithmeticException
 - HALF_UP:向最近的整数舍入,其中x.5远离零方向舍入
 - HALF_DOWN:向最近的整数舍入,其中x.5向零方向舍入
 - HALF_EVEN:向最近的整数舍入,其中x.5向相邻的偶数舍入
 
这些方法旨在提高代码的可读性,例如,divide(x, 3, CEILING) 即使在快速阅读时也是清晰。此外,这些方法内部采用构建整数近似值再计算的实现,除了在构建sqrt(平方根)运算的初始近似值时有浮点运算,其他方法的运算全过程都是整数或位运算,因此性能上更好。
1 | 
// returns 31622776601683793319988935444327185337195551393252 | 
2 | 
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本文链接地址: [Google Guava] 12-数学运算
[Google Guava] 12-数学运算的更多相关文章
- [转载]Google Guava官方教程(中文版)
		
原文链接 译文链接 译者: 沈义扬,罗立树,何一昕,武祖 校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] ...
 - Google Guava官方教程(中文版)
		
Google Guava官方教程(中文版) 原文链接 译文链接 译者: 沈义扬,罗立树,何一昕,武祖 校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库, ...
 - com.google.guava  包解析 ——Google Guava官方教程(中文版)
		
全网址 http://ifeve.com/google-guava/ 竹子博客: http://www.cnblogs.com/peida/archive/2013/06/08/ ...
 - 初探Google Guava
		
Guava地址:https://github.com/google/guava 第一次接触我是在16年春github上,当时在找单机查缓存方法,google guava当初取名是因为JAVA的类库不好 ...
 - Google Guava新手教程
		
以下资料整理自网络 一.Google Guava入门介绍 引言 Guavaproject包括了若干被Google的 Java项目广泛依赖 的核心库,比如:集合 [collections] . ...
 - Google Guava官方教程
		
原文链接 译文链接 译者: 沈义扬,罗立树,何一昕,*武祖 * 校对:方腾飞 引言 Guava工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] . ...
 - Google Guava入门教程
		
以下资料整理自网络 一.Google Guava入门介绍 引言 Guava 工程包含了若干被Google的 Java项目广泛依赖 的核心库,例如:集合 [collections] .缓存 [cachi ...
 - [Google Guava] 8-区间
		
原文链接 译文链接 译文:沈义扬 范例 1 List scores; 2 Iterable belowMedian =Iterables.filter(scores,Range.lessThan(me ...
 - 使用 Google Guava 美化你的 Java 代码
		
文章转载自:http://my.oschina.net/leejun2005/blog/172328 目录:[ - ] 1-使用 GOOGLE COLLECTIONS,GUAVA,STATIC IMP ...
 
随机推荐
- 去掉右键Open Folderas Intellij IDEA Project
			
解决: WIN+R键打开运行,输入regedit 打开注册表 在地址栏输入: 计算机\HKEY_CLASSES_ROOT\Directory\Background\shell\Powershell 然 ...
 - (六)Cookie 知识点总结 (来自那些年的笔记)
			
如果你想要转载话,可不可以不要删掉下面的 作者信息 呀!: 作者:淮左白衣 写于 2018年4月18日18:47:41 来源笔者自己之前学javaWeb的时候,写的笔记 : 目录 如果你想要转载话,可 ...
 - matplotlib笔记1
			
散点图-scatter 散点图显示两组数据的值,每个点的坐标位置由变量的值决定由一组不连接的点完成,用于观察两种变量的相关 import numpy as np import matplotlib.p ...
 - spring cloud微服务实践二
			
在上一篇,我们已经搭建了spring cloud微服务中的注册中心.但只有一个注册中心还远远不够. 接下来我们就来尝试提供服务. 注:这一个系列的开发环境版本为 java1.8, spring boo ...
 - SAS学习笔记30 SAS各种常用随机函数
			
UNIFORM(seed) 产生(0,1)区域均匀分布随机数,乘同余发生器 RANUNI(seed) 产生(0,1)区域均匀分布随机数,素数模发生器 NORMAL(seed) 产生标准正态分布随机数, ...
 - java——数据类型和运算符
			
强类型语言 Java语言是一门强类型语言.强类型包含两方面的含义:①所有的变量必须先声明.后使用:②指定类型的变量只能接受类型与之匹配的值.强类型语言可以在编译过程中发现源代码的错误,从而保证程序更加 ...
 - Qt中的常用容器类(解释比较全面,有插图)
			
在Qt库中为我们提供了一系列的基于模板的容器类.这些类可以被用来存储特定类型的项.例如,如果你需要一个大小可以变得QString数组,那么可以使用QVector<QString>. 这些容 ...
 - (十)web服务与javaweb结合(1)
			
一.解决方法 A . 编写一个监听器,在监听器中发布服务 二.案例一 方法A:编写一个监听器,在监听器中发布服务 1. 编写服务接口 package com.shyroke.service; impo ...
 - 数据仓库之抽取数据:通过openrowset执行存储过程
			
原文:数据仓库之抽取数据:通过openrowset执行存储过程 在做数据仓库时,最重要的就是ETL的开发,而在ETL开发中的第一步,就是要从原OLTP系统中抽取数据到过渡区中,再对这个过渡区中的数据进 ...
 - c# winfrom 子窗体分屏显示
			
参考博客:https://blog.csdn.net/kailan818/article/details/8517126 实现代码: private void button1_Click(object ...