在我的项目中,我从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
答案 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);