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?
BigDecimal正如其他人所提到的,如果您想获得 11.4 的精确表示,您可能希望使用该类。
BigDecimal
现在,稍微解释一下为什么会发生这种情况:
Java 中的float和double原始类型是浮点数,其中数字存储为分数和指数的二进制表示。
float
double
更具体地说,类型等双精度浮点值double是 64 位值,其中:
这些部分组合起来产生一个double值的表示。
(来源:维基百科:双精度)
有关如何在 Java 中处理浮点值的详细说明,请参阅第 4.2.3 节:Java 语言规范的浮点类型、格式和值。
, byte, char,类型是定点数int,它们是数字的精确表示。与定点数不同,浮点数有时(可以安全地假设“大部分时间”)无法返回数字的精确表示。这就是为什么你最终得到.long11.399999999999``5.6 + 5.8
byte
char
int
long
11.399999999999``5.6 + 5.8
当需要一个精确的值(例如 1.5 或 150.1005)时,您需要使用其中一种能够精确表示数字的定点类型。
正如已经多次提到的,Java 有一个BigDecimal类可以处理非常大的数字和非常小的数字。
来自BigDecimal该类的 Java API 参考:
不可变的、任意精度的有符号十进制数。BigDecimal 由一个任意精度的整数未缩放值和一个 32 位整数刻度组成。如果为零或正数,则刻度是小数点右侧的位数。如果为负数,则将数字的未缩放值乘以 10 的负数次方。因此 BigDecimal 所表示的数字的值是 (unscaledValue × 10^-scale)。