
本文为《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 删除。