在字符串上解析 double 给出错误的结果

Parse double on string giving wrong result

在我的项目中,我从 api 获取字符串值,需要将双精度值传递给另一个 api。当我尝试将字符串值解析为 double 时,我没有得到原始数据。

这是代码。

String l1="11352721345377306";
String l2="11352721346734307";
String l3="11352721346734308";
String l4="11352721346734309";

DecimalFormat df = new DecimalFormat(".00");

System.out.println(df.format(Double.parseDouble(l1)));
System.out.println(df.format(Double.parseDouble(l2)));
System.out.println(df.format(Double.parseDouble(l3)));  
System.out.println(df.format(Double.parseDouble(l4)));

输出是

11352721345377306.00
11352721346734308.00
11352721346734308.00
11352721346734308.00

出了什么问题?解析有问题吗?我怎样才能恢复原来的值?

编辑:不使用十进制格式:

1.1352721345377306E16
1.1352721346734308E16
1.1352721346734308E16
1.1352721346734308E16

您无法取回原始值。参考这个 Java's Floating-Point (Im)Precision.

有什么问题吗? “.00”?如果你不需要这个,为什么要使用 Double ?

你可以这样试试...

    String l1="11352721345377306";
    String l2="11352721346734307";
    String l3="11352721346734308";
    String l4="11352721346734309";

    Double d1 = Double.parseDouble(l1);
    Double d2 = Double.parseDouble(l2);
    Double d3 = Double.parseDouble(l3);  
    Double d4 = Double.parseDouble(l4);

    System.out.println(d1.longValue());
    System.out.println(d2.longValue());
    System.out.println(d3.longValue());  
    System.out.println(d4.longValue());

编辑,使用 BigDecimal 获取正确的值:

    String l1="11352721345377306";
    String l2="11352721346734307";
    String l3="11352721346734308";
    String l4="11352721346734309";

    BigDecimal bd1 = new BigDecimal(l1);
    BigDecimal bd2 = new BigDecimal(l2);
    BigDecimal bd3 = new BigDecimal(l3);
    BigDecimal bd4 = new BigDecimal(l4);

    System.out.println(bd1);
    System.out.println(bd2);
    System.out.println(bd3);  
    System.out.println(bd4);

输出为:

11352721345377306
11352721346734307
11352721346734308
11352721346734309

double 只有 15/16 位的精度,当你给它一个它不能表示的数字时,它会取最接近的可表示数字。

您可以使用

double d = Math.round(Double.parse(yourString) * 100.0) / 100.0;

四舍五入的小数点加倍。

打印使用:

String formatted = String.format("%.2f", yourDouble);