【发布时间】:2013-03-15 13:39:03
【问题描述】:
所以当我在 Java 中使用 Doubles 进行加法或减法时,它会给我带来奇怪的结果。以下是一些:
如果我添加0.0 + 5.1,它会给我5.1。没错。
如果我添加5.1 + 0.1,它会给我5.199999999999(重复9s 的次数可能会关闭)。错了。
如果我减去4.8 - 0.4,它会给我4.39999999999995(同样,重复的9s 可能会关闭)。错了。
起初我以为这只是用十进制值添加双精度的问题,但我错了。以下工作正常:
5.1 + 0.2 = 5.3
5.1 - 0.3 = 4.8
现在,添加的第一个数字是保存为变量的双精度数,尽管第二个变量从JTextField 中获取文本。例如:
//doubleNum = 5.1 RIGHT HERE
//The textfield has only a "0.1" in it.
doubleNum += Double.parseDouble(textField.getText());
//doubleNum = 5.199999999999999
【问题讨论】:
-
顺便说一句,更喜欢使用 BigDecimal (docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html)
-
其实5.19999999...(有无数个重复的9)在数学上和5.2完全一样,如果你不相信,试着找出两者的区别是什么。它是 0,因此它们是相同的。
-
@Ingo 从技术上讲,是的,但我想有一点准确的答案:)
-
Rob,我明白了,我很遗憾这些数字被称为“float”和“double”。适当的名称是“粗略的近似”和“稍微好一点,但仍然是粗略的近似”