Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Fomat双精度到小数点后2位,不使用字符串_Java_Double_Tableview - Fatal编程技术网

Java Fomat双精度到小数点后2位,不使用字符串

Java Fomat双精度到小数点后2位,不使用字符串,java,double,tableview,Java,Double,Tableview,我正在做一个项目,它要求我在小数点后2位有两个值。通过一些数学计算,我目前对大多数数字进行了正确的四舍五入,除非有尾随的零。我想保留这些0的结果,比如0.00,特别是这个列表显示在TableView中,因此必须可以数字排序。我希望double值实际上是double,以便它可以正确排序 有没有办法不用String.format保留两位小数 提前谢谢。您可以使用DecimalFormat DecimalFormat df = new DecimalFormat("#.00"); 00=正好是小数

我正在做一个项目,它要求我在小数点后2位有两个值。通过一些数学计算,我目前对大多数数字进行了正确的四舍五入,除非有尾随的零。我想保留这些0的结果,比如0.00,特别是这个列表显示在TableView中,因此必须可以数字排序。我希望double值实际上是double,以便它可以正确排序

有没有办法不用String.format保留两位小数


提前谢谢。

您可以使用DecimalFormat

DecimalFormat df = new DecimalFormat("#.00"); 
00=正好是小数点后两位

class TableValue implements Comparable<TableValue> {

    double value;

    public TableValue(double value) {
        this.value = value;

    }

    public int compareTo(TableValue o) {
        return Double.compare(this.value, o.value);
    }


    public String toString() {
        DecimalFormat df = new DecimalFormat("0.00");
        return df.format(value);
    }
}
但这将给您一个字符串,您可以再次将其转换为double,如果您不想通过这个字符串转换来了解如何使用bigdecim实现它的话

如果这不是为了学习pourposes,DecimalFormat对你来说就足够了。诚然,在转换的某个时刻,您必须使用字符串,但您将只读取和存储双精度值,并且您的排序将是正确的…

您可以使用DecimalFormat,只需将DecimalFormat的构造函数中的格式设置为所需的2dp即可:

double d = 1.234567;
DecimalFormat df = new DecimalFormat("#.##");
System.out.print(df.format(d));
输出:

1.23
1.20
此代码将小数点四舍五入至小数点,但如果其本身的值不是最小小数点后2位,则其结果将不会达到小数点后2位。e、 g

    double d = 1.2;
    DecimalFormat df = new DecimalFormat("#.##");
    System.out.print(df.format(d));
输出:

1.2
正如Thisaru Guruge所说,Jordi Castilla回答说,您可以像这样使用:

 double d = 1.2;
    DecimalFormat df = new DecimalFormat("#.00");
    System.out.print(df.format(d));
输出:

1.23
1.20
您可以尝试,也可以简单地创建自己的对象,该对象实现排序接口,并具有一个toString方法,该方法输出格式化为两位小数的值

class TableValue implements Comparable<TableValue> {

    double value;

    public TableValue(double value) {
        this.value = value;

    }

    public int compareTo(TableValue o) {
        return Double.compare(this.value, o.value);
    }


    public String toString() {
        DecimalFormat df = new DecimalFormat("0.00");
        return df.format(value);
    }
}

Double是不精确的,BigDecimal还有一个额外的属性:它的精度

因此,新的大小数5.20的精度为2,而双精度5.20*10000可能足以偏离52000.0

记住,可以避免的新的大小数5.20既不知道精确性,也不精确


不幸的是,BigDecimal有一个COBOListic用法。

这个答案扩展了使用java.math.BigDecimal而不是double的建议

对于这个应用程序,它比double更好,因为每两位小数都可以用BigDecimal表示。根据几种舍入模式(包括用于双精度算术的舍入模式)中的任意一种,可以轻松地将任意双精度表示值舍入到小数点后两位

另一方面,它优于字符串,因为自然排序顺序是数值

下面是一个简短的演示程序,演示了以下几点:

import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class Test {
  public static void main(String[] args) throws Throwable {
    List<BigDecimal> list = new ArrayList<BigDecimal>();
    double[] in = {
        3.5,
        Math.PI,
        -100.123456,
        1e6
    };
    System.out.println("Original doubles: "+Arrays.toString(in));
    for(double d : in){
      list.add(doubleToBigDecimal(d,1));
    }
    System.out.println("Before sorting: " + list);
    Collections.sort(list);
    System.out.println("After sorting: " + list);
  }

  public static BigDecimal doubleToBigDecimal(double in, int places) {
    BigDecimal result = new BigDecimal(in).setScale(2,
        BigDecimal.ROUND_HALF_EVEN);
    return result;
  }
}

重复:仅供参考,谷歌搜索双精度小数点后2位时第一次点击javaWhy double而不是BigDecimal?这将显示0.00为0.0。不是0.00使用DecimalFormat0.00就可以了。参考:我主要关心的是这些双值显示在TableView中。表格本身可以通过选择一列进行排序,该列工作正常。表格单元格显示存储为SimpleDoubleProperty的双精度值。四舍五入到小数点后2位是正确的,除非有尾随的零,所以我试图找到一种解决方法。例2.50而不是2.5所以你需要的是双字符串double如果你认为BigDecimal本质上是精确的,试着用它来计算1/3。在这种情况下,它确实比double有一个优势——精确表示所有短小数。