Java 新浮动(“0.333”)转换我的0.333 0.333+;(小数点后14位)
可能重复:Java 新浮动(“0.333”)转换我的0.333 0.333+;(小数点后14位),java,Java,可能重复: 所以我运行这段代码从文件中读取浮点字符串值,并将这些值存储到数组中。当程序从文件中读取“0.333”时,它会创建一个新的浮点值,但该值会转换为0.33329994468896!为什么会这样?我如何解决这个问题?矩阵声明如下: this.matrix = new double[this.getRow()][this.getCol()]; this.bMatrix = new double[this.getRow()]; try { // make sure no
所以我运行这段代码从文件中读取浮点字符串值,并将这些值存储到数组中。当程序从文件中读取“0.333”时,它会创建一个新的浮点值,但该值会转换为0.33329994468896!为什么会这样?我如何解决这个问题?矩阵声明如下:
this.matrix = new double[this.getRow()][this.getCol()];
this.bMatrix = new double[this.getRow()];
try {
// make sure no blank lines at the end of the file.
for (int i = 0; (strLine = reader.readLine()) != null; i++) {
System.out.println("Line from file #" + i + " " + strLine);
String[] columns = strLine.trim().split("\\s+");
for (int j = 0; j < columns.length; j++) {
if (j < (columns.length - 1)) {
//A-matrix
this.matrix[i][j] = new Float(columns[j]).floatValue();
System.out.println("Element added to A-matrix: " + columns[j]);
} else {
// B-matrix
bMatrix[i] = new Float(columns[j]).floatValue();
System.out.println("Element added to B-matrix: " + columns[j]);
}
}
}
showMatrix();
} catch (IOException | NumberFormatException e) {
reader.close();
}
}
this.matrix=newdouble[this.getRow()][this.getCol()];
this.bMatrix=newdouble[this.getRow()];
试一试{
//确保文件末尾没有空行。
对于(inti=0;(strLine=reader.readLine())!=null;i++{
System.out.println(“文件中的行#“+i+”+strLine);
String[]columns=strLine.trim().split(\\s+);
对于(int j=0;j
感谢您的帮助。这与二进制表示浮点数的方式有关。本质上,你不能精确地表示0.333。你能得到的最接近的数字是你看到的数字。如果要打印的版本较短,请在输出值之前使用StringFormatter或其他工具。这是一个多副本。让我们搜索一下。在我们找到之前,这里有一个元素:但是0.3332999446868896离0.333太远了。浮点应具有23位二进制数字精度。他们真的是同一个问题吗?@Gene是的,一个浮点数的精度只有8位小数。这似乎只是一个打字错误,而写0.3333的海报是必须的。更容易理解哇。我希望不是这样。我需要准确的数字以便以后计算。因此,我无法将0.333转换为新的Float()值?@Michael如果精度对您来说非常重要,请使用
BigDecimal
,浮点计算本质上是不准确的。对于Java原语,没有任何错误。必须有数字库来处理这个问题,但它们的使用速度要慢几个数量级。