java - Java中float类型的转换和计算

标签 java ieee-754

我试图真正了解更多关于 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/

相关文章:

java - 我的 Storm 拓扑既不工作(不生成输出)也不失败(不生成错误或异常)

java - Cassandra-unit : java. io.IOException:连接被对等方重置

java - View 内的 runOnUiThread

floating-point - Lua-包装IEEE754单精度 float

javascript - 提取 Javascript 数字的指数和尾数

java - 明确分配变量

java - 分析故障转储 (NULL_CLASS_PTR_READ)

types - IEEE-754 float 是如何工作的

javascript - JavaScript 中的 float (IEEE 754)

c - 如何根据 IEEE 754 (ansi-c) 获取 double 的上/下机器字?