Java 有没有一种有效的方法可以对内部有双精度值的字符串进行取整,并得到双精度值的答案?

Java 有没有一种有效的方法可以对内部有双精度值的字符串进行取整,并得到双精度值的答案?,java,formatting,format,string-formatting,number-formatting,Java,Formatting,Format,String Formatting,Number Formatting,所以我的问题有点困惑,但仍然是。我从外部源代码获得一个由8个字符串组成的数组,其中所有字符串都包含双精度值。这些值通常在小数点后4位: 12345.5678 我想做的是将其转换为小数点后3位,并对其进行四舍五入,然后在输出中得到结果: 12345.568 下面是代码示例: private double[] parseDouble(String[] values) { double[] output = new double[values.length]; for (int i

所以我的问题有点困惑,但仍然是。我从外部源代码获得一个由8个字符串组成的数组,其中所有字符串都包含双精度值。这些值通常在小数点后4位:

12345.5678

我想做的是将其转换为小数点后3位,并对其进行四舍五入,然后在输出中得到结果:

12345.568

下面是代码示例:

private double[] parseDouble(String[] values) { 
    double[] output = new double[values.length];
    for (int i = 0; i < values.length; i++) { 
        output[i] = Double.parseDouble(String.format("%.3f", 
        Double.parseDouble(values[i]));
    } 
    return output; 
}
private double[]parseDouble(字符串[]值){
double[]输出=新的double[values.length];
对于(int i=0;i
因此,我的问题是:

1.还有比这更好的方法吗?因为在我看来,解析为两倍是非常多余的

2.如果字符串数组中的数值在100-1000左右,它会影响性能吗?


提前感谢!

对于答案的合理性,我可以建议您这样做,但您不需要声明数组结果

private double[] parseDouble(String[] values) {
    double[] result = Arrays.stream(values).mapToDouble(Double::parseDouble).toArray();
    return result;
}
现在它只会将字符串解析为双精度

对于它们的外观,您需要一个格式化程序:

DecimalFormat df = new DecimalFormat("#.###");
df.setRoundingMode(RoundingMode.CEILING);
double[] x = { 12345.5678, Math.PI, 123.123451, Math.E };
Arrays.stream(x).forEach(n -> System.out.println(df.format(n)));

我建议将这两种方法结合起来,记住无论打印多少个小数位,double都是double。

为了得到正确的答案,我可以建议这样做,但不需要声明数组结果

private double[] parseDouble(String[] values) {
    double[] result = Arrays.stream(values).mapToDouble(Double::parseDouble).toArray();
    return result;
}
现在它只会将字符串解析为双精度

对于它们的外观,您需要一个格式化程序:

DecimalFormat df = new DecimalFormat("#.###");
df.setRoundingMode(RoundingMode.CEILING);
double[] x = { 12345.5678, Math.PI, 123.123451, Math.E };
Arrays.stream(x).forEach(n -> System.out.println(df.format(n)));

我建议将这两种方法结合起来,记住无论打印多少个小数位,double都是double。

有什么原因不想在解析后对
double
进行四舍五入吗?看看你在这里做的事情,如果你想进行这种排序,看起来
BigDecimal
更合适以10位为基数的精确精度。
double
永远不会满足您的要求。您只需解析一次(字符串到double),其余只是一种格式double[]output=double(values.length);???这是一个诚实的错误,我犯的应该是double[]output=new double[values.length];有什么原因不想在解析后对
double
进行四舍五入吗?看看你在这里做的事情,如果你想要这种10位数的基本精确精度,
bigdecime
看起来更合适。
double
对你来说永远都不太合适。你只需要解析一次(字符串到双精度)剩下的只是一个格式,double[]output=double(values.length)是什么意思????我犯了一个诚实的错误,应该是double[]output=new double[values.length];就是这样!我不需要打印出来,我需要对数组的值进行计算,这就是为什么方法本身应该返回double数组,四舍五入到小数点后3位。而且,似乎任何类型的格式化程序都将参数作为double并以字符串格式返回结果,这就是为什么我必须将其解析为dou我找不到一种方法将双精度小数点从4四舍五入到3小数点(我可能看起来很糟糕)并获取双精度作为返回值。为什么在进行计算之前需要对其进行四舍五入?如果需要精确的十进制值,首先不应该使用
double
。这些值本身不会大于99999.999或小于0.000,我需要将它们存储在用于Android的SQLite数据库中,并在以后检索d双倍格式似乎是最好的方式,因为您只能在数据库中将其保存为int、double或string。因此,我倾向于认为将其转换为
double
是唯一仍然无法解释为什么需要对其进行舍入的方式。
double.parseDouble
为您提供了一个double,您可以将其存储为double,您不需要对其进行舍入o任何其他内容。每个双精度值都存储为64位IEEE 754浮点数(Java和SQLite都遵循此标准)。抱歉,响应太晚。它必须舍入,因为这是此任务的数据表示方式。就是这样!我不需要打印它,我需要对数组的值进行计算,这就是为什么方法本身应该返回双精度数组,舍入到小数点后3位。此外,似乎任何形式的ater将参数作为double并以字符串格式返回结果,这就是为什么我必须再次将其解析为double。我找不到将double从4四舍五入到3个小数点的方法(我可能看起来很糟糕)并获取双精度作为返回值。为什么在进行计算之前需要对其进行四舍五入?如果需要精确的十进制值,首先不应该使用
double
。这些值本身不会大于99999.999或小于0.000,我需要将它们存储在用于Android的SQLite数据库中,并在以后检索d双倍格式似乎是最好的方式,因为您只能在数据库中将其保存为int、double或string。因此,我倾向于认为将其转换为
double
是唯一仍然无法解释为什么需要对其进行舍入的方式。
double.parseDouble
为您提供了一个double,您可以将其存储为double,您不需要对其进行舍入o任何其他内容。每个双精度值都存储为64位IEEE 754浮点数(Java和SQLite都遵循此标准)。很抱歉响应太晚。必须对其进行舍入,因为这是此任务的数据表示方式。