我遇到了(我怀疑的)舍入错误。
我有一个字符串0.686357E-01
,我正在尝试将其转换为double。我已经能够使用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);
那么,我该如何避免舍入错误? (我可以通过各种方式解决这个问题,但如果可以做到,那么我想知道如何解决这个问题)
感谢。
答案 0 :(得分:6)
0.0686357不能完全表示为双精度值。
两种解决方案:
BigDecimal
。答案 1 :(得分:6)
你不需要拆分它,Double.parseDouble
可以很好地处理这些数字。
double number = Double.parseDouble("0.686357E-01");
答案 2 :(得分:1)
浮点数不具备完美的精度。如果这是一个问题,请使用BigDecimal:
String string = "0.686357E-01";
BigDecimal number = new BigDecimal(string);
System.out.println(number);
答案 3 :(得分:0)
Double
将始终打印,但值仍将保持正确。您需要格式化输出以获取正确的值。见DecimalFormat
class。