在字符串上解析 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);
在我的项目中,我从 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);