为何BigDecimal输出结果不符合预期?浮点数初始化问题咨询
为什么用double初始化BigDecimal会得到意外结果?
我太懂这种踩坑的感觉了!你遇到的问题核心在于浮点数(double类型)本身的精度限制,而非BigDecimal的问题。
问题根源
当你写new BigDecimal(0.6883116883116883116883116883)时,Java会先把这个十进制小数转换成double类型存储。但计算机里的浮点数是用二进制表示的,绝大多数十进制小数都无法被二进制浮点数精确表示——你输入的这个数就是其中之一。
这个转换过程已经让数值变成了一个近似值(也就是控制台输出的0.68831168831168831889755210795556195080280303955078125),BigDecimal只是忠实地把这个近似值保存了下来,所以输出自然和你的预期不符。
解决方案:用字符串初始化BigDecimal
要精确保留你输入的十进制数值,一定要用字符串参数的BigDecimal构造函数,直接传入你想要的精确值:
BigDecimal d1 = new BigDecimal("0.6883116883116883116883116883"); System.out.println(d1);
运行这段代码,控制台就会输出你预期的0.6883116883116883116883116883了。
额外提醒
BigDecimal提供了多个构造函数,记住一个原则:
- 如果需要精确的十进制数值表示,优先使用
String参数的构造函数; - 只有当你明确接受浮点数的近似值时,才用
double参数的构造函数。
内容的提问来源于stack exchange,提问作者Choi
相关产品推荐
相关产品推荐

