Java Math.pow()舍入错误

Java Math.pow()舍入错误,java,double,Java,Double,我(怀疑是)有舍入错误 我有一个字符串,0.686357E-01,我正试图将其转换为双精度。我已经能够使用Pattern.split()函数将其拆分,并且可以很好地捕获基值和指数值。然而,一旦我尝试将它们适当地相乘,结果是:0.068635700000001 这是我的相关代码: pattern = Pattern.compile("E\\+?"); String[] number = pattern.split(string); double base = Double.parseDouble

我(怀疑是)有舍入错误

我有一个字符串,
0.686357E-01
,我正试图将其转换为双精度。我已经能够使用
Pattern.split()
函数将其拆分,并且可以很好地捕获基值和指数值。然而,一旦我尝试将它们适当地相乘,结果是:
0.068635700000001

这是我的相关代码:

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);
那么,如何避免舍入误差呢?(我有办法解决这个问题,但如果可能的话,我想知道如何解决这个问题)


谢谢。

0.0686357不能准确表示为双精度值

两种解决方案:

  • 使用例如
    BigDecimal
  • 当转换回人类可读时,将显示的精度限制为一定数量的有效数字

  • 0.0686357不能准确表示为双精度值

    两种解决方案:

    • 使用例如
      BigDecimal
    • 当转换回人类可读时,将显示的精度限制为一定数量的有效数字

    浮点数没有完美的精度。如果这是一个问题,请使用:


    浮点数没有完美的精度。如果这是一个问题,请使用:


    您不需要拆分它,
    Double.parseDouble
    可以很好地处理这些类型的数字

    double number = Double.parseDouble("0.686357E-01");
    

    您不需要拆分它,
    Double.parseDouble
    可以很好地处理这些类型的数字

    double number = Double.parseDouble("0.686357E-01");
    

    Double
    将始终这样打印,但值将保持正确。您需要格式化输出以获得正确的值。参见类。

    Double
    将始终这样打印,但值将保持正确。您需要格式化输出以获得正确的值。请参见课程。

    这不是舍入错误。这就是大多数编程语言中float/double的行为方式。处理浮点数时,永远不能有100%的精度。这就是为什么人们不鼓励使用
    (float1==float2)
    ,而只使用
    abs(float1-float2)
    。我相信精度只能保证在10^15。有趣的是,我以前从未经历过这种行为。“没办法避免吗?”马特斯第一次说。这实际上是一个复杂的数值分析,给CPU架构师和制造商带来了麻烦。这不是舍入误差。这就是大多数编程语言中float/double的行为方式。处理浮点数时,永远不能有100%的精度。这就是为什么人们不鼓励使用
    (float1==float2)
    ,而只使用
    abs(float1-float2)
    。我相信精度只能保证在10^15。有趣的是,我以前从未经历过这种行为。“没办法避免吗?”马特斯第一次说。这实际上是一个复杂的数值分析,这给CPU架构师和制造商带来了麻烦。问题是有时候这个数字实际上有一个“E+00”的指数,解析器似乎不喜欢这个指数。否则我会那样做的。@MattS:嗯。。。这对我来说很好。我认为你的问题在别处。有趣的是,我刚刚尝试过,它似乎确实有效。我一定是犯了什么错误,以前把事情搞砸了。谢谢问题是有时这个数字实际上有一个“E+00”的指数,解析器似乎不喜欢这个指数。否则我会那样做的。@MattS:嗯。。。这对我来说很好。我认为你的问题在别处。有趣的是,我刚刚尝试过,它似乎确实有效。我一定是犯了什么错误,以前把事情搞砸了。谢谢