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?
原文由 Deinumite 发布,翻译遵循 CC BY-SA 4.0 许可协议
正如其他人所提到的,如果您想要精确表示 11.4,您可能想要使用
BigDecimal
类。现在,稍微解释一下为什么会发生这种情况:
Java 中的
float
和double
原始类型是 浮点数,其中数字存储为分数和指数的二进制表示。更具体地说,诸如
double
类型的双精度浮点值是 64 位值,其中:这些部分组合起来产生一个值的
double
表示。(来源: 维基百科:双精度)
有关如何在 Java 中处理浮点值的详细说明,请参阅 第 4.2.3 节:Java 语言规范的浮点类型、格式和值。
The
byte
,char
,int
,long
types are fixed-point numbers, which are exact representions of numbers.与定点数不同,浮点数有时(可以安全地假设“大部分时间”)无法返回数字的精确表示。这就是您最终得到11.399999999999
的原因5.6 + 5.8
。当需要一个精确的值(例如 1.5 或 150.1005)时,您需要使用其中一种能够精确表示数字的定点类型。
正如已经多次提到的,Java 有一个
BigDecimal
类,它可以处理非常大的数字和非常小的数字。来自
BigDecimal
类的 Java API 参考:Stack Overflow 上有很多关于浮点数及其精度的问题。以下是可能感兴趣的相关问题列表:
如果您真的想深入了解浮点数的基本细节,请查看 每个计算机科学家应该了解的关于浮点运算的知识。