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 { /** * 获得数字对应的二进制字符串 + * * * @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); + } }