1.科学计数法转换
在开发的时候调用某个组件的数据做了加法之后竟然返回科学计数法!!但是其他字段又不是科学计数法,简直会令人当场去世,而且返回的还是字符串类型的科学计数法,在一波搜索了一圈之后发现一个解决办法
String toBeTransfer="1.9899E8";
Double doubleTransfer=Double.parseDouble(toBeTransfer);
NumberFormat numberFormat=NumberFormat.getInstance();
String transferNum=numberFormat.format(doubleTransfer);
System.out.println(transferNum);
先解析成Double再调用NumberFormat做转换
我们可以看到是输出是带千分位符号的字符串,我们想转成BigInteger那么必然需要去掉这个逗号,可能我们想到的第一种解决办法就是字符串替换,用空字符串替代逗号,那么还有其他办法吗?有的!只要加上
numberFormat.setGroupingUsed(false);
2.ConcurrentMap的value问题
在使用java8的并行流做天粒度聚合操作的时候发现报错
@Data
public class MidGdpHandle {
private LocalDateTime time;
private String gdpCode;
private BigInteger value;
}
//----------有问题的代码如下-------
ConcurrentMap<LocalDate, ConcurrentMap<String, BigInteger>> midMap = midGdpHandleList.parallelStream()
.collect(Collectors.groupingByConcurrent(midGdpHandle -> midGdpHandle.getTime()
.toLocalDate(), Collectors.groupingByConcurrent(MidGdpHandle::getGdpCode,
Collectors.collectingAndThen(Collectors.toList(), this::reduceEveryDayAloneGdpCodeValue))));
代码如上,本意是先做时间天粒度聚合,再做类型聚合,但是一运行到没有数据的那天做类型聚合的时候发现会报空指针
找了好久原因才发现ConcurrentMap不允许value为null!所以做第二次聚合的时候不使用groupingByConcurrent取而代之使用groupingBy,这样返回hashMap就不用担心key,value为null的问题了。
扩展
NumberFormat是所有数字格式的抽象基类。 该类提供格式化和解析数字的接口。 NumberFormat还提供了确定哪些区域设置具有数字格式以及它们的名称的方法。
setRoundingMode
设置舍入模式
HALF_EVEN
向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。如果舍弃部分左边的数字为奇数,则舍入行为
同 RoundingMode.HALF_UP;如果为偶数,则舍入行为同 RoundingMode.HALF_DOWN。注意,在重复进行一系列计算时,此舍入模式可以在统计上将累加错误减到最小。
此舍入模式也称为“银行家舍入法”,主要在美国使用。此舍入模式类似于 Java 中对 float 和 double 算法使用的舍入策略。
HALF_UP
此舍入模式就是通常学校里讲的四舍五入。
HALF_DOWN
应该按上面的理解话,是五舍六入。
FLOOR
向负无限大方向舍入的舍入模式,此舍入模式始终不会增加计算值。白话文就是向下取整。
CEILING
向正无限大方向舍入的舍入模式。此舍入模式始终不会减少计算值。向上取整
UP
这个也是向上取整,但是,如果是坐标轴的话,这个都是远离零的方向取整,5.5->6; -2.5->-3
DOWN
这个也是向下取整,但是,如果是坐标轴的话,这个都是靠近零的方向取整,5.5->5; -2.5->-2
setCurrency
设置格式化货币值时此数字格式使用的货币。 这不会更新数字格式使用的小数位数的最小或最大数量。
getIntegerInstance
返回当前默认值FORMAT区域设置的整数格式。 返回的数字格式被配置成使用半甚至舍入圆浮点数到最接近的整数(参见RoundingMode.HALF_EVEN )进行格式化,并且解析仅一个输入字符串的整数部分
getInstance
返回指定区域设置的通用数字格式。 这与调用getNumberInstance()相同。
其他api详见java文档
参考:
http://www.matools.com/api/java8
https://blog.csdn.net/qq_27093465/article/details/54668012