diff --git a/CHANGELOG.md b/CHANGELOG.md
index 8670b476b0..d7eb4907bd 100755
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,12 +1,13 @@
# 🚀Changelog
-------------------------------------------------------------------------------------------------------------
-# 5.8.43(2025-12-01)
+# 5.8.43(2025-12-09)
### 🐣新特性
* 【core 】 `ColorUtil`颜色名称DARKGOLD、LIGHTGOLD新增蛇形命名匹配(pr#1400@Github)
### 🐞Bug修复
-* 【core 】 修复`Calculator.conversion(String expression)`方法计算包含科学计数法表达式的值时逻辑有误,结果不符合预期(pr#4172@Github)
+* 【core 】 修复`Calculator.conversion`方法计算包含科学计数法表达式的值时逻辑有误,结果不符合预期(pr#4172@Github)
+* 【core 】 修复`NumberUtil.getBinaryStr`方法计算Double等丢失小数问题(pr#1411@Gitee)
-------------------------------------------------------------------------------------------------------------
# 5.8.42(2025-11-28)
diff --git a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java
index f0fe6d600e..2679a17aa6 100755
--- a/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java
+++ b/hutool-core/src/main/java/cn/hutool/core/util/NumberUtil.java
@@ -1697,11 +1697,17 @@ public class NumberUtil {
/**
* 获得数字对应的二进制字符串
+ *
+ * - Integer/Long:直接使用 JDK 内置方法转换
+ * - Byte/Short:转换为无符号整数后补充前导零至对应位数(Byte=8位,Short=16位)
+ * - Float/Double:使用 IEEE 754 标准格式转换,Float=32位,Double=64位
+ *
*
* @param number 数字
* @return 二进制字符串
*/
public static String getBinaryStr(Number number) {
+ Assert.notNull(number, "Number must be not null!");
if (number instanceof Double) {
// 处理double类型
@@ -1711,16 +1717,21 @@ public class NumberUtil {
// 处理float类型
int bits = Float.floatToIntBits((Float) number);
return String.format("%32s", Integer.toBinaryString(bits)).replace(' ', '0');
- }
-
- if (number instanceof Long) {
+ }else if (number instanceof Long) {
return Long.toBinaryString((Long) number);
} else if (number instanceof Integer) {
return Integer.toBinaryString((Integer) number);
+ } else if (number instanceof Byte) {
+ // Byte是8位,补前导0至8位
+ return String.format("%8s", Integer.toBinaryString(number.byteValue() & 0xFF)).replace(' ', '0');
+ } else if (number instanceof Short) {
+ // Short是16位,补前导0至16位
+ return String.format("%16s", Integer.toBinaryString(number.shortValue() & 0xFFFF)).replace(' ', '0');
+ } else if (number instanceof BigInteger) {
+ // 大数整数类型
+ return ((BigInteger) number).toString(2);
} else {
- System.out.println(number.getClass().getName());
return Long.toBinaryString(number.longValue());
-
}
}
diff --git a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java
index b25c6d6060..5329e2eb5f 100644
--- a/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java
+++ b/hutool-core/src/test/java/cn/hutool/core/util/NumberUtilTest.java
@@ -621,7 +621,7 @@ public class NumberUtilTest {
assertTrue(NumberUtil.isPrimes(2147483647));
assertFalse(NumberUtil.isPrimes(2147483646));
}
-
+
@Test
public void range(){
assertFalse(NumberUtil.isIn(new BigDecimal("1"),new BigDecimal("2"),new BigDecimal("12")));
@@ -704,4 +704,11 @@ public class NumberUtilTest {
final boolean equals = NumberUtil.equals(104557543L, 104557544);
assertFalse(equals);
}
+
+ @Test
+ public void testGetFloatBinaryStr() {
+ // 获取浮点数的 IEEE 754 原始比特位字符串
+ final String result = NumberUtil.getBinaryStr(3.5);
+ assertEquals("0100000000001100000000000000000000000000000000000000000000000000", result);
+ }
}