本文为《Java Coding Problems》31-39题,问题涉及String, Number和Math (共39题)。
double/float
是否有限问题:浮点运算可能会产生无穷大值Infinity
,判断给定double/float
是否有限(不是无穷大)。
思路:绝对值小于最大的浮点数,则给定数有限。
代码如下:
public static boolean isFinite(double val) {
return Math.abs(val) < Double.MAX_VALUE;
}
标准库自带该方法,可修改为:
public static boolean isFinite(double val) {
return Double.isFinite(val);
}
问题:对两个boolean表达式进行 与/或/异或 操作。
思路:使用三个操作符,其中与为&&
,或为||
,异或为^
。JDK 8
中这三个操作符有对应的方法:Boolean.logicalAnd
,Boolean.logicalOr
,Boolean.logicalXor
。
BigInteger
转换成long
,int
问题:将BigInteger
转换成long
,int
,并在精度丢失时抛出异常。
思路:使用longValueExact
方法进行转换,它会在精度丢失时抛出异常。
代码如下:
public static long isFinite(BigInteger val) {
return val.longValueExact();
}
long
转换成int
问题:将long
转换成int
,并在精度丢失时抛出异常。
思路:使用Math.toIntExact
。
代码如下:
public static int longToInt(long val) {
return Math.toIntExact(val);
}
floor
值问题:求两个整数商的floor
值,例222/14 = 15.85
,floor
后为15
;-222/14 = -15.85
,floor
后为-16
。
思路:直接用整数除法/
,在商为正的情况下,就是答案,在商为负的情况下,如果不整除应该减一。
代码如下:
public static long floorDiv(long x, long y) {
long r = x / y;
// 商为负,且不整除
if ((x ^ y) < 0L && r * y != x) {
--r;
}
return r;
}
标准库中已有该实现,代码可改为:
public static long floorDiv(long x, long y) {
return Math.floorDiv(x, y);
}
问题:已知一个double
数,求离它最近的两个浮点数(大于它的和小于它的两个数)。
思路:使用Math.nextDown
获取离它最近的较小数,使用Math.nextUp
获取离它最近的较大数。
代码如下:
public static Pair<Double, Double> next(double d) {
double smaller = Math.nextDown(d);
double bigger = Math.nextUp(d);
return new Pair(smaller, bigger);
}
问题:两个整数相乘,并在溢出时抛出ArithmeticException
异常。
思路:使用Math.multiplyExact
方法,它会在溢出时抛出异常。
a * b + c
问题:a * b + c
类型的式子在矩阵乘法中广泛使用(Fused Multiply Add),计算其值。
思路:部分现代Intel处理器有特殊指令用于快速计算此式,JDK 9
中提供了对应优化方法Math.fma
。
代码如下:
public static double cal(double a, double b, double c) {
return Math.fma(a, b, c);
}
问题:数字和紧凑数字格式的相互转换,比如数字55000
可以用5,50K
表示。
思路:JDK 12
中提供了java.text.CompactNumberFormat
类可用于此类转换。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。