小编典典

在 Java 中使用 double 保持精度

all

public class doublePrecision {
public static void main(String[] args) {

        double total = 0;
        total += 5.6;
        total += 5.8;
        System.out.println(total);
    }
}

上面的代码打印:

11.399999999999

我如何才能让它打印(或能够将其用作)11.4?


阅读 63

收藏
2022-08-21

共1个答案

小编典典

BigDecimal正如其他人所提到的,如果您想获得
11.4 的精确表示,您可能希望使用该类。

现在,稍微解释一下为什么会发生这种情况:

Java
中的floatdouble原始类型是浮点数,其中数字存储为分数和指数的二进制表示。

更具体地说,类型等双精度浮点值double是 64 位值,其中:

  • 1 位表示符号(正或负)。
  • 11 位为指数。
  • 有效数字为 52 位(小数部分为二进制)。

这些部分组合起来产生一个double值的表示。

(来源:维基百科:双精度

有关如何在 Java 中处理浮点值的详细说明,请参阅第 4.2.3 节:Java
语言规范的浮点类型、格式和值

, byte, char,类型是定点数int,它们是数字的精确表示。与定点数不同,浮点数有时(可以安全地假设“大部分时间”)无法返回数字的精确表示。这就是为什么你最终得到.long11.399999999999``5.6 + 5.8

当需要一个精确的值(例如 1.5 或 150.1005)时,您需要使用其中一种能够精确表示数字的定点类型。

正如已经多次提到的,Java
有一个BigDecimal类可以处理非常大的数字和非常小的数字。

来自BigDecimal该类的 Java API 参考:

不可变的、任意精度的有符号十进制数。BigDecimal 由一个任意精度的整数未缩放值和一个 32
位整数刻度组成。如果为零或正数,则刻度是小数点右侧的位数。如果为负数,则将数字的未缩放值乘以 10 的负数次方。因此 BigDecimal
所表示的数字的值是 (unscaledValue × 10^-scale)。

2022-08-21