
本文介绍如何在 Kotlin/Java 中安全、精确地将 Double 转换为 Int,同时移除小数点、拼接所有数字位(如 1.123 → 1123),避免浮点误差和截断风险,推荐使用 BigDecimal 实现无损转换。
本文介绍如何在 kotlin/java 中安全、精确地将 `double` 转换为 `int`,同时移除小数点、拼接所有数字位(如 `1.123` → `1123`),避免浮点误差和截断风险,推荐使用 `bigdecimal` 实现无损转换。
在实际开发中,有时需要将形如 1.123、0.12345 的 Double 值“去掉小数点后整体转为整数”,即按字符串视角拼接所有有效数字(不含小数点与末尾零),再解析为 Int。但直接使用 (d * 10^k).toInt() 易受二进制浮点表示误差影响(如 0.1 + 0.2 != 0.3),而字符串切分虽直观却非最优——本文提供更健壮、语义清晰的数值化方案。
核心思路是:借助 BigDecimal 消除浮点精度污染,通过 unscaledValue() 获取去除标度后的纯整数大数,再安全转为 Int。
✅ 正确做法(Java 示例):
import java.math.BigDecimal;
public class DoubleToIntConverter {
public static int doubleToConcatenatedInt(double value) {
// 使用 valueOf 避免 double 构造器的精度陷阱(如 new BigDecimal(0.1) → 0.10000000000000000555...)
BigDecimal bd = BigDecimal.valueOf(value);
// 移除小数点:等价于「乘以 10^scale 并取整」,结果为无标度整数
return bd.unscaledValue().intValueExact(); // 自动抛出 ArithmeticException 若溢出 int 范围
}
public static void main(String[] args) {
System.out.println(doubleToConcatenatedInt(1.123)); // 1123
System.out.println(doubleToConcatenatedInt(1.1)); // 11
System.out.println(doubleToConcatenatedInt(1.12345)); // 112345 ← 注意:原文示例写为 11234,但按题意“去除小数点”应为 112345;若需截断末位,请额外说明规则
System.out.println(doubleToConcatenatedInt(0.12345)); // 12345
}
}
✅ Kotlin 等效实现(更简洁):
import java.math.BigDecimal
fun Double.toConcatenatedInt(): Int {
return BigDecimal.valueOf(this)
.unscaledValue()
.toIntExact() // Kotlin 扩展,底层调用 intValueExact()
}
// 使用示例
println(1.123.toConcatenatedInt()) // 1123
println(0.12345.toConcatenatedInt()) // 12345
⚠️ 重要注意事项:
-
BigDecimal.valueOf(double)是安全起点;切勿使用new BigDecimal(double),后者会暴露 IEEE 754 表示缺陷(如new BigDecimal(0.1)实际存储为0.1000000000000000055511151231257827021181583404541015625); -
unscaledValue()返回的是BigInteger,代表value × 10^scale的精确整数,完全保留原始数字的所有有效位; -
intValueExact()在结果超出[-2³¹, 2³¹−1]时抛出ArithmeticException,符合题干“所有 double 不超过 Int 内存限制”的前提,且提供明确错误反馈; - 若业务要求舍弃末位(如
1.12345 → 11234),需额外指定精度策略(如先setScale(4, HALF_DOWN)),但此属定制逻辑,不在通用去点转换范畴内。
总结:用 BigDecimal.valueOf(d).unscaledValue().intValueExact() 替代字符串操作,既保证数值准确性,又提升可读性与类型安全性,是处理此类“动态去点整型转换”问题的最佳实践。










