前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Strings, Numbers, Math 31-39

Strings, Numbers, Math 31-39

原创
作者头像
luoheng
发布2022-09-04 20:53:28
2930
发布2022-09-04 20:53:28
举报
文章被收录于专栏:luohengluoheng

本文为《Java Coding Problems》31-39题,问题涉及String, Number和Math (共39题)。

31. 判断double/float是否有限

问题:浮点运算可能会产生无穷大值Infinity,判断给定double/float是否有限(不是无穷大)。

思路:绝对值小于最大的浮点数,则给定数有限。

代码如下:

代码语言:java
复制
public static boolean isFinite(double val) {
    return Math.abs(val) < Double.MAX_VALUE;
}

标准库自带该方法,可修改为:

代码语言:java
复制
public static boolean isFinite(double val) {
    return Double.isFinite(val);
}

32. 对两个boolean表达式进行 与/或/异或 操作

问题:对两个boolean表达式进行 与/或/异或 操作。

思路:使用三个操作符,其中与为&&,或为||,异或为^JDK 8中这三个操作符有对应的方法:Boolean.logicalAndBoolean.logicalOrBoolean.logicalXor

33. BigInteger转换成longint

问题:将BigInteger转换成longint,并在精度丢失时抛出异常。

思路:使用longValueExact方法进行转换,它会在精度丢失时抛出异常。

代码如下:

代码语言:java
复制
public static long isFinite(BigInteger val) {
    return val.longValueExact();
}

34. long转换成int

问题:将long转换成int,并在精度丢失时抛出异常。

思路:使用Math.toIntExact

代码如下:

代码语言:java
复制
public static int longToInt(long val) {
    return Math.toIntExact(val);
}

35. 两个整数商的floor

问题:求两个整数商的floor值,例222/14 = 15.85floor后为15-222/14 = -15.85floor后为-16

思路:直接用整数除法/,在商为正的情况下,就是答案,在商为负的情况下,如果不整除应该减一。

代码如下:

代码语言:java
复制
public static long floorDiv(long x, long y) {
    long r = x / y;
    // 商为负,且不整除
    if ((x ^ y) < 0L && r * y != x) {
        --r;
    }

    return r;
}

标准库中已有该实现,代码可改为:

代码语言:java
复制
public static long floorDiv(long x, long y) {
    return Math.floorDiv(x, y);
}

36. 下一个相邻浮点数

问题:已知一个double数,求离它最近的两个浮点数(大于它的和小于它的两个数)。

思路:使用Math.nextDown获取离它最近的较小数,使用Math.nextUp获取离它最近的较大数。

代码如下:

代码语言:java
复制
public static Pair<Double, Double> next(double d) {
    double smaller = Math.nextDown(d);
    double bigger = Math.nextUp(d);
    return new Pair(smaller, bigger);
}

37. 两数乘法

问题:两个整数相乘,并在溢出时抛出ArithmeticException异常。

思路:使用Math.multiplyExact方法,它会在溢出时抛出异常。

38. 快速计算浮点式a * b + c

问题:a * b + c类型的式子在矩阵乘法中广泛使用(Fused Multiply Add),计算其值。

思路:部分现代Intel处理器有特殊指令用于快速计算此式,JDK 9中提供了对应优化方法Math.fma

代码如下:

代码语言:java
复制
public static double cal(double a, double b, double c) {
    return Math.fma(a, b, c);
}

39. 紧凑数字格式

问题:数字和紧凑数字格式的相互转换,比如数字55000可以用5,50K表示。

思路:JDK 12中提供了java.text.CompactNumberFormat类可用于此类转换。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 31. 判断double/float是否有限
  • 32. 对两个boolean表达式进行 与/或/异或 操作
  • 33. BigInteger转换成long,int
  • 34. long转换成int
  • 35. 两个整数商的floor值
  • 36. 下一个相邻浮点数
  • 37. 两数乘法
  • 38. 快速计算浮点式a * b + c
  • 39. 紧凑数字格式
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
http://www.vxiaotou.com