【问题标题】:Is there a difference between Double.parseDouble(list.get(i).toString()) and list.get(i) if list is an arraylist<Double>如果 list 是 arraylist<Double>,Double.parseDouble(list.get(i).toString()) 和 list.get(i) 之间有区别吗
【发布时间】:2022-01-27 17:42:10
【问题描述】:

我有两个像这样创建的双精度数组列表:

ArrayList <Double> axis_x = new ArrayList<Double>();
ArrayList <Double> axis_y = new ArrayList<Double>();

现在,我在使用时看到了计算的不同(因为我想简化计算)

for(int j=0; j<axis_x.size();j++) {
    double ax_x = Double.parseDouble(axis_x.get(j).toString()) + Math.abs(left_scale);
    axis_x.set(j,ax_x);//axis_y.get(i);
    double ax_y=0.0f;
    if(Double.parseDouble(axis_y.get(j).toString()) < 0.0f) {
        ax_y = Math.abs(Double.parseDouble(axis_y.get(j).toString())) + Math.abs(up_scale);
    }else if(Double.parseDouble(axis_y.get(j).toString()) > 0.0f) {
        ax_y = Math.abs(Double.parseDouble(axis_y.get(j).toString()) - Math.abs(up_scale));
    }else if(Double.parseDouble(axis_y.get(j).toString()) == 0.0f) {
        ax_y = Math.abs(up_scale);
    }
    axis_y.set(j,ax_y);
}

VS

for(int j=0; j<axis_x.size();j++) {
    double ax_x = axis_x.get(j) + Math.abs(left_scale);
    axis_x.set(j,ax_x);
    double ax_y=0.0f;
    if(axis_y.get(j) < 0.0f) {
        ax_y = Math.abs(axis_y.get(j)) + Math.abs(up_scale);
    }else if(axis_y.get(j) > 0.0f) {
        ax_y = Math.abs(axis_y.get(j)) - Math.abs(up_scale);
    }else if(axis_y.get(j) == 0.0f) {
        ax_y = Math.abs(up_scale);
    }
    axis_y.set(j,ax_y);
}

知道axis_y.get(i)应该是double,Double.parseDouble(axis_y.get(j).toString())axis_y.get(i)不一样吗?我在这里遗漏了什么吗?

【问题讨论】:

  • 一方面,您获得了双精度的原始值,另一方面,您将其转换为字符串,然后将其转换回双精度。这对于精度相对较低的数字应该没问题,但是如果精度很高,您将面临出现一些浮点错误的风险。对于浮点数,应尽可能避免类型转换。

标签: java loops arraylist


【解决方案1】:

请看上面提到的两种获取Double项目的方法:

final ArrayList<Double> axis_x = new ArrayList<Double>();

// Way #1. Getting the Double item from the `List<Double>`
//   without performing any conversions.
final int i = 0;
final Double x = axis_x.get(i);

// Way #2. Getting the Double item from the `List<Double>`
//   with performing two redundant conversions.
final Double x =
    // `String => Double` conversion.
    Double.parseDouble(
        // `Double => String` conversion.
        axis_x.get(i).toString()
    );

应该使用方式#1直接获取项目,即不执行任何转换。

#2 的方式使用两个冗余转换:Double =&gt; StringString =&gt; Double
因此,应该避免这种方式。

【讨论】:

  • 方式 2 的冗余是我想切换到方式 1 的原因,但我最终得到了完全其他值.. 烦人。
【解决方案2】:

#1:final Double x = axis_x.get(i);

#2:final Double x = parseDouble(axis_x.get(i).toString());

Double

方式 2 不是智能且更短的方式。 方式 1 也是精确值。

【讨论】:

  • 谢谢。这可能就是为什么我没有完全相同的值。
猜你喜欢
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-26
  • 2016-06-29
  • 1970-01-01
  • 2021-12-21
  • 1970-01-01
相关资源
最近更新 更多