网站首页 > 技术文章 正文
你知道吗,有些问题如果你知道解决方案就非常简单,如果你不知道就会觉得非常困难?这正是这种问题。解决方案非常简单,你可以在下面的代码中看到:
double value = -9.33543545;
double fractionalPart = value % 1;
double integralPart = value - fractionalPart;
这很简单;我认为你不需要进一步的解释。但这种方法并不完全准确。我的意思是整数部分是-9,但这样返回的是-9.0。而小数部分是-0.33543545,但返回的值是-0.3354354500000003。
如果我们需要一个更准确的结果,那么使用BigDecimal会更有用:
BigDecimal bd = BigDecimal.valueOf(value);
int integralPart = bd.intValue();
double fractionalPart = bd.subtract(
BigDecimal.valueOf(integralPart)).doubleValue();
这次,结果是-9和-0.33543545。
21. 测试double数字是否为整数
首先,让我们考虑以下预期结果(false表示double不是整数):
double v1 = 23.11; // false
double v2 = 23; // true
double v3 = 23.0; // true
double v4 = Double.NaN; // false
double v5 = Double.NEGATIVE_INFINITY; // false
double v6 = Double.POSITIVE_INFINITY; // false
很可能,测试double数字是否为整数的第一个解决方案是一个简单的类型转换,如下所示:
public static boolean isDoubleIntegerV1(double v) {
return v == (int) v;
}
但是,还有其他几种选择。例如,我们可以依赖模数运算,如下所示:
public static boolean isDoubleIntegerV2(double v) {
return v % 1 == 0;
}
或者,依赖Math.floor()和Double.isFinite()方法。如果给定的double是一个有限数,并且等于Math.floor()的结果,那么它就是一个整数:
public static boolean isDoubleIntegerV3(double v) {
return ((Math.floor(v) == v) && Double.isFinite(v));
}
我们还可以用Math.ceil()替换这个等式:
public static boolean isDoubleIntegerV4(double v) {
return (Math.floor(v) == Math.ceil(v) && Double.isFinite(v));
}
此外,我们可以将Double.isFinite()与Math.rint()结合起来,如下所示:
public static boolean isDoubleIntegerV5(double v) {
return ((Math.rint(v) == v) && Double.isFinite(v));
}
最后,我们可以依赖Guava的DoubleMath.isMathematicalInteger():
public static boolean isDoubleIntegerV6(double v) {
return DoubleMath.isMathematicalInteger(v);
}
但是,这些方法中哪一种性能更好?你更倾向于哪一种?好吧,让我们看看基准测试的结果怎么说:
图1.19 - 基准测试结果
基于这些结果,一个结论非常明显:依赖模数的方法应该避免。而且,Guava的解决方案似乎比其他方法稍慢一些。
猜你喜欢
- 2024-09-29 “全栈2019”Java原子操作第六章:AtomicInteger灵活的运算方式
- 2024-09-29 JAVA程序设计练习题一(附答案)(java程序设计题目题库)
- 2024-09-29 Java基础笔试练习(四)(java基础笔试题大全带答案)
- 2024-09-29 C/C++实战030:double转int常见的取整操作
- 2024-09-29 java-数据类型转换(Java数据类型转换规则)
- 2024-09-29 Java String字符串和整型int的相互转换
- 2024-09-29 Java教程:任意大整数的相加运算(java编程实现任意两个整数的大小)
- 2024-09-29 在java中String的方法:toString()怎么用
- 2024-09-29 Java基础之String与int两者之间如何相互转换?
- 2024-09-29 关于Java中的double类型数据(java中double类型占几个字节)
- 1509℃桌面软件开发新体验!用 Blazor Hybrid 打造简洁高效的视频处理工具
- 530℃Dify工具使用全场景:dify-sandbox沙盒的原理(源码篇·第2期)
- 493℃MySQL service启动脚本浅析(r12笔记第59天)
- 473℃服务器异常重启,导致mysql启动失败,问题解决过程记录
- 470℃启用MySQL查询缓存(mysql8.0查询缓存)
- 451℃「赵强老师」MySQL的闪回(赵强iso是哪个大学毕业的)
- 430℃mysql服务怎么启动和关闭?(mysql服务怎么启动和关闭)
- 427℃MySQL server PID file could not be found!失败
- 最近发表
- 标签列表
-
- c++中::是什么意思 (83)
- 标签用于 (65)
- 主键只能有一个吗 (66)
- c#console.writeline不显示 (75)
- pythoncase语句 (81)
- es6includes (73)
- windowsscripthost (67)
- apt-getinstall-y (86)
- node_modules怎么生成 (76)
- chromepost (65)
- c++int转char (75)
- static函数和普通函数 (76)
- el-date-picker开始日期早于结束日期 (70)
- js判断是否是json字符串 (67)
- checkout-b (67)
- localstorage.removeitem (74)
- vector线程安全吗 (70)
- & (66)
- java (73)
- js数组插入 (83)
- linux删除一个文件夹 (65)
- mac安装java (72)
- eacces (67)
- 查看mysql是否启动 (70)
- 无效的列索引 (74)