【发布时间】:2012-07-03 21:24:59
【问题描述】:
我遇到了(我怀疑是)舍入错误的问题。
我有一个字符串0.686357E-01,我正在尝试将其转换为双精度。我已经能够使用Pattern.split() 函数将其拆分,并且我可以很好地捕获基值和指数值。但是,一旦我尝试将它们适当地相乘,就会得到以下结果:0.06863570000000001。
这是我的相关代码:
pattern = Pattern.compile("E\\+?");
String[] number = pattern.split(string);
double base = Double.parseDouble(number[0]);
int exponent = Integer.parseInt(number[1]);
number= base*Math.pow(10, exponent);
那么,如何避免舍入误差? (有一些方法可以解决它,但如果可以,那么我想知道如何解决这个问题)
谢谢。
【问题讨论】:
-
这不是舍入错误。这就是大多数编程语言中 float/double 的行为方式。处理浮点数永远不可能有 100% 的精度。这就是为什么人们不鼓励使用
(float1 == float2)而只是使用abs(float1 - float2) < epsilon。我相信精度只能保证到 10^15。 -
有趣 - 我以前从未经历过这种行为。没有办法避免吗?
-
@MattS 第一次做所有事情。这实际上是一个复杂的数值分析,problem 让 CPU 架构师和制造商头疼。