事实恰恰相反。BigDecimal
正在告诉你真相。 0.26579999923706055 更接近您的值float
在四舍五入之前和之后都有所有时间。 Afloat
作为二进制数而不是十进制数不能精确地保存 0.2658。实际上 0.265799999237060546875 是我们能得到的最接近的值。
当您打印浮点数时,您不会获得完整的值。会发生一些舍入,因此尽管float
具有上述值,您只会看到0.2658
.
当您创建一个BigDecimal
来自float
,你实际上首先转换为double
(因为这就是BigDecimal.valueOf()
接受)。这double
具有相同的值float
,但会打印为 0.26579999923706055,这也是您的值BigDecimal
gets.
如果你想要一个BigDecimal
拥有printed的值float
而不是其中的确切值或接近的值,以下可能有效:
BigDecimal bd = new BigDecimal(String.valueOf(roundedNumber));
System.out.println(bd);
Output:
0.2658
不过,您可能会对其他值感到惊讶,因为float
还没有那么高的精度。
编辑:你正在有效地转换float
-> double
-> String
-> BigDecimal
.
Dawood ibn Kareem 的这些富有洞察力的评论让我进行了一些研究:
实际上是0.265799999237060546875。
Well, 0.26579999923706055
是调用返回的值toString
on the double
价值。这和号码不一样
实际上代表的是double
。这就是为什么BigDecimal.valueOf(double)
通常不会返回相同的值
作为new BigDecimal(double)
。了解这一点非常重要
如果您要使用浮点值,则会有所不同
与BigDecimal
.
那么到底发生了什么:
- Your
float
在舍入之前和之后,内部的值为 0.265799999237060546875。
- When you are passing your
float
to BigDecimal.valueOf(double)
, you are effectively converting float
-> double
-> String
-> BigDecimal
.
- The
double
具有相同的值float
,0.265799999237060546875。
- 转换为
String
稍微舍入到"0.26579999923706055"
.
- So your
BigDecimal
获取值 0.26579999923706055,即您看到并询问的值。
从文档BigDecimal.valueOf(double)
:
翻译一个double
into a BigDecimal
, 使用double
的
提供的规范字符串表示Double.toString(double)
method.
Links
- 堆栈溢出问题:浮点数学有问题吗?
- 文档:BigDecimal.valueOf(double)
- 堆栈溢出问题:BigDecimal - 使用 new 或 valueOf