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

时间:2015-12-29 12:56:49

标签: java parsing double

在我的项目中,我从api获取字符串值,需要将double值传递给另一个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

4 个答案:

答案 0 :(得分:8)

您无法获得原始值。请参阅此Java's Floating-Point (Im)Precision

答案 1 :(得分:4)

double只有15/16位数的准确度,当你给它一个无法表示的数字时,它会得到最接近的可表示数字。

答案 2 :(得分:0)

有什么问题? " 0.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

答案 3 :(得分:0)

您可以使用

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

获得带舍入小数的两倍。

用于印刷用途:

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