我试图真正了解更多关于 Java 中的 float 、 double 和大十进制数的知识。我想确切地知道 float 在每种类型中是如何表示的,例如。 float 使用 2^,大数使用 10^ 加上缩放(32 位)和未缩放值(任意精度)。
我使用所有三种类型进行了简单的计算,并对每种类型进行了对话,结果相当困惑。我希望得到一些关于为什么唯一正确的表示是 float 的提示,以及为什么在转换为 Double 和 BigDecimal 时存在尾随不精确性的提示。这与二进制表示转换有关吗?无论如何,这里是代码及其输出:
// Float - 32b
float a = 3.14f;
float b = 3.100004f;
float abAsAFloat = a + b;
double abAsADouble = a + b;
BigDecimal abAsABigDecimal = new BigDecimal(a + b);
System.out.println("a + b as a float: " + abAsAFloat);
System.out.println("a + b as a double: " + abAsADouble);
System.out.println("a + b as a BigDecimal: " + abAsABigDecimal);
// Double - 64b
double c = 3.14;
double d = 3.100004;
double cdAsADouble = c + d;
BigDecimal cdAsABigDecimal = new BigDecimal(c + d);
System.out.println("c + d as a double: " + cdAsADouble);
System.out.println("c + d as a BigDecimal: " + cdAsABigDecimal);
// BigDecimal, arbitrary-precision, signBit*unscaledValue × 10^-scale
BigDecimal e = new BigDecimal(3.14);
BigDecimal f = new BigDecimal(3.100004);
BigDecimal efAsABigDecimal = e.add(f);
System.out.println("e + f: " + efAsABigDecimal);
// Drawbacks. speed, memory, native value equality, no overloads for +/- et al
a + b as a float: 6.240004
a + b as a double: 6.240004062652588
a + b as a BigDecimal: 6.240004062652587890625
c + d as a double: 6.240004000000001
c + d as a BigDecimal: 6.2400040000000007722746886429376900196075439453125
e + f: 6.240004000000000328185478792875073850154876708984375
最佳答案
您无意中混合了类型。例如:
BigDecimal e = new BigDecimal(3.14);
BigDecimal f = new BigDecimal(3.100004);
在这种情况下,您提供 double 作为输入,因此 e 和 f 将具有 double 残基。相反,使用这个:
BigDecimal e = new BigDecimal("3.14");
BigDecimal f = new BigDecimal("3.100004");
浮点输出似乎是最准确的,因为 Java“知道”浮点的精度有限,因此它不会打印 15 位数字。
关于java - Java中float类型的转换和计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32595351/