一句话说清楚 Java 中的 RoundingMode (舍入策略枚举)
首先请想象有这样一根X坐标轴:
负无穷 ----(-6)–(-5)–(-2)–(-1.1)–(-1) --> 0 --(1)–(1.1)–(2)–(5.5)–(6)----> 正无穷
- RoundingMode.UP 取背向0的整数,即距离0更远的数。如:5.5=>6, 1.1=>2, -5.5=>-6, -1.1=>-2
- DOWN 取朝向0的整数,即距离0更近的数。如:5.5=>5, 1.1=>1, -5.5=>-5, -1.1=>-1
- CEILING 取朝向正无穷的整数,ceiling 也有天花板的意思。如:5.5=>6, 1.1=>2, -5.5=>-5, -1.1=>-1
- FLOOR 取朝向负无穷的整数,floor 也有地板的意思。如:5.5=>5, 1.1=>1, -5.5=>-6, -1.1=>-2
- HALF_UP 四舍五入。入时同 UP,舍时同DOWN。这样来理解,HALF 表示0.5时怎么办,UP表示用 UP 模式,即背向0的策略。所以,HALF_UP就是指0.5时用UP策略,其他情况,所有带 HALF_ 前缀的策略都有相同的逻辑,即大于一半时,用入(UP)策略,小于一半时,用舍(DOWN)的策略。
- HALF_DOWN 四舍五不入,大于0.5才入,0.5时舍(DOWN)。入时同UP,舍时同DOWN。
- HALF_EVEN 0.5时朝向最近的偶数即偶整数。如:5.5 => 6, 2.5 => 2,其他情况该舍的舍该入的入,即 >0.5 入(UP),<0.5 舍(DOWN)。这个最有意思,因为可以最小化连续累加时的误差。也被称为“银行家算法”。
BigDecimal 是不可变的 (Immutable)
所以不用担心你的 BigDecimal 对象被其他地方给修改了,如果要改变 BigDecimal 对象的状态,必定会创建一个新对象,例如你想改变 scale,那么必须这样写
BigDecimal newDecimal = oldDecimal.setScale(2);
// 原来 oldDecimal 对象的状态并不会改变
ClassLoader 和 Class 的 getResource() 方法相比,有什么差异?
Class 的 getResource(String)
和 ClassLoader 的 getResource(String)
方法都可以用来获取一个资源的 URL 路径,这二者的区别是 ClassLoader 的资源路径不能以 “/” 开头,因为从 ClassLoader 中装载资源被认为总是从根部开始的,不需要区分相对路径和绝对路径;而 Class 的资源路径需要区分相对路径和绝对路径,因此 “/abc.property” 和 “abc.property” 分别表示从类路径的根开始和从本类所在的包路径开始查找 abc.property 资源