如何将double值转换为BigInteger或long?转换值与原值不符求解
解决double转BigInteger/long时的精度丢失问题
这事儿我之前踩过一模一样的坑!你遇到的问题核心在于double类型的精度限制——它根本存不下你这么大的整数,在赋值给double变量的那一刻,数值就已经被近似处理了,后面再转什么类型都没法恢复原始值。
为什么会出现这个问题?
double是64位浮点数,其中只有53位用来存储有效数字(二进制),换算成十进制的话大概只有15-17位的精确有效数字。而你要存储的123456789123456789123456789有27位十进制数,远远超出了double的精确存储范围。当你把这个数赋值给double变量时,JVM已经自动把它近似成了最接近的可表示double值,也就是你输出里的123456789123456790000000000,后面的转换只是基于这个近似值操作,自然得不到原始数。
正确的解决方法
如果要处理这么大的整数,绝对不要用double来存储,直接用字符串作为数据源来构造BigInteger或BigDecimal,这样能完整保留所有精度:
// 方法1:直接用字符串构造BigInteger String numStr = "123456789123456789123456789"; BigInteger bigInt = new BigInteger(numStr); System.out.println("value==" + bigInt); // 方法2:用字符串构造BigDecimal再转BigInteger BigDecimal bd = new BigDecimal(numStr); System.out.println("value==" + bd.toBigInteger());
这两种方式都会输出你期望的123456789123456789123456789,因为字符串不会丢失任何精度信息。
额外提醒
如果你是从外部获取这个数值(比如用户输入、接口返回),一定要优先用字符串格式接收,避免中途转成double导致精度丢失。如果必须处理double类型的大数,那只能接受它已经是近似值的事实——毕竟double本身就没能力精确存储这么大的整数。
内容的提问来源于stack exchange,提问作者Heisenberg
相关产品推荐
相关产品推荐

