java BigDecimal存储垃圾值的问题

java BigDecimal存储垃圾值的问题,java,bigdecimal,double-precision,Java,Bigdecimal,Double Precision,输出: BigDecimal b = new BigDecimal(0.05); System.out.println(b); 如何处理此问题?将其转换为此 0.05000000000000000277555756156289135105907917022705078125 当您通过0.05时,默认值为double值,这就是double表示数字的方式,数字是严格正确的。这是一个精确的值0.05,双精度。这是因为double不能准确表示所有值,而必须为您提供最接近的可表

输出:

    BigDecimal b = new BigDecimal(0.05);
    System.out.println(b);
如何处理此问题?

将其转换为此

    0.05000000000000000277555756156289135105907917022705078125

当您通过
0.05
时,默认值为
double
值,这就是double

表示数字的方式,数字是严格正确的。这是一个精确的值0.05,双精度。这是因为
double
不能准确表示所有值,而必须为您提供最接近的可表示值。打印值时,它假定您要将其舍入,并隐藏表示错误。BigDecimal只是向您展示了值的真正含义

如果您想将double转换为BigDecimal,并按照预期使用的方式将其四舍五入

BigDecimal b = new BigDecimal("0.05");

另一个解决方案是不使用BigDecimal。如果您使用适当的四舍五入的
double
,您将得到相同的答案,代码更少,代码更快。

这不是“垃圾值”。这是0.05的双精度浮点表示法。另请参见本主题(以及其他主题)的Java拼图演示:
0.5
double
而不是
float
,正如
0.05
一样。这将转换字符串。但是如果你想转换一个double,请使用
valueOf(double)
@Peter是的,关于
double
,你是对的,更正了,谢谢,+1我真的很喜欢java的BigDecimal。特别是因为它写起来真的很好。@HighCore我也喜欢BigDecimal。我最近在一个风险管理系统中遇到了这个问题,使用的是BigDecimal
(43/7)*7!=43
。我是在挖苦人。。检查链接。@HighCore我“喜欢”在使用BigDecimal的过程中经历了所有的痛苦之后,BigDecimal仍然会出现舍入错误。顺便说一句,2014年,有些语言也会出现舍入错误。
BigDecimal b = BigDecimal.valueOf(0.05);