Java - 十进制格式返回Float或Decimal时精度丢失

时间:2017-04-07 20:20:18

标签: java double precision

我已经审查了许多与格式化数字相关的线程。 在大多数情况下,它的工作除了值3.101。 Float和Double已与##和00格式一起使用。

import java.text.DecimalFormat;

public class DecimalFormatTest {
public static void main(String[] args) 
{
    Float d1 = -3.1011f;
    Double ds = -3.1011;
    DecimalFormat df = new DecimalFormat("#.##");
    System.out.println (Double.valueOf(df.format(d1)));
    System.out.println (Double.valueOf(df.format(ds)));

    DecimalFormat df2 = new DecimalFormat("#.00");
    System.out.println (Double.valueOf(df2.format(d1)));
    System.out.println (Double.valueOf(df2.format(ds)));
 }
}

输出结果为:

-3.1
-3.1
-3.1
-3.1

预期产出:

-3.10
-3.10
-3.10
-3.10

如上所述,这适用于我测试过的所有其他数字。由于某种原因,这导致了一个问题。

关于是什么让这个数字变得如此不同以及获得第二位数需要多少步骤的任何想法?

请记住,关键是我想最终返回Float或Double。

3 个答案:

答案 0 :(得分:3)

试试这个。

public static void main(String[] args) 
    {
        Float d1 = -3.1011f;
        Double ds = -3.1011;
        DecimalFormat df = new DecimalFormat("0.00");
        System.out.println (df.format(d1));
        System.out.println (df.format(ds));

        DecimalFormat df2 = new DecimalFormat("0.00");
        System.out.println (df2.format(d1));
        System.out.println (df2.format(ds));
     }

答案 1 :(得分:0)

这有效:

Double number = 3.101;
System.out.printf("%.2f", number);

答案 2 :(得分:0)

这里的主要罪魁祸首是Double.valueOf。尝试删除它,它应该工作正常如下: 另外,("#.##")会导致进一步的问题。所以最好在精度之后使用任何("0.00")至少。

import java.text.DecimalFormat;

public class DecimalFormatTest {
public static void main(String[] args) 
    {
        Float d1 = -3.1011f;
        Double ds = -3.1011;
        DecimalFormat df = new DecimalFormat("0.00");
        System.out.println (df.format(d1));
        System.out.println (df.format(ds));

        DecimalFormat df2 = new DecimalFormat("0.00");
        System.out.println (df2.format(d1));
        System.out.println (df2.format(ds));
     }
}

供参考:Double decimal formatting in Java