浮点数表示,Java示例

3
请问,为什么我得到了下面的结果:
当我运行以下代码:
System.out.println((0.2 - 0.1));

我得到了:0.1

当我运行以下代码时:

System.out.println((0.3 - 0.2));

我得到的结果是:0.09999999999999998

我知道数字“0.1”在二进制中没有有限的表示,但这并不能解释上面的结果。最有可能的是这与特定的编程语言无关,而是与计算机中数字的存储方式有关。


4
好的,我会尽力进行翻译。以下是链接中的内容:《什么每个计算机程序员应该知道浮点运算》摘自 David Goldberg,ACM 计算机杂志 ,1991 年 3 月。本文介绍了计算机科学家需要了解的浮点数基础知识。它旨在通过解释浮点数的工作方式和可能产生的舍入误差来提高程序员的意识,并为他们提供在编写可靠的数值代码时使用的技术。 - Steve P.
2
从标题中删除“无理数”,因为“无理数”一词具有特定的含义,与问题无关。 - Ingo
2个回答

1
Java使用IEEE浮点来表示double值。这不是精确的表示方式,有些计算会产生微小的误差,表现为这种情况。

0

我同意Bohemian的观点(floatdouble不是精确的),所以你会遇到这样的奇怪情况

但是,你的问题有解决方案:

NumberFormat nf = NumberFormat.getInstance();
nf.setMaximumFractionDigits(1);
nf.format(0.3f - 0.2f);

这将产生0.1


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接