将字符串解析为双精度浮点数得到错误结果

5

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

以下是代码。

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

出了什么问题?解析有问题吗?如何恢复原始值?

编辑:不使用Decimal Format:

1.1352721345377306E16
1.1352721346734308E16
1.1352721346734308E16
1.1352721346734308E16

4
使用BigDecimal获取数值。BigDecimal dec = new BigDecimal(l4); System.out.println(df.format(dec)); - Thanigai Arasu
@ThanigaiArasu 谢谢。我需要传递“double”值,因为API源不可编辑。 :) - Madhukar Hebbar
4个回答

8

我需要那个值。有其他的选择吗? - Madhukar Hebbar
4
使用BigDecimal? - npinti
可以使用BigDecimal,但api只接受double类型,并且它是一个没有源代码的jar文件。即使我尝试使用“BigDecimal.doubleValue”,输出也是相同的。 - Madhukar Hebbar
2
准确值无法存储在double中,因此在这种情况下你的任务是不可能完成的。 - Keppil
@MadhukarHebbar 可以将字符串值与相应的双精度值保存在某个地方。 - v.ladynev
@v.ladynev 最终我需要传递双精度值。我认为这是不可能的。让我试几天。 - Madhukar Hebbar

4

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


0

你可以使用

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

获取带有四舍五入小数的双精度。

用于打印:

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

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

问题在于这些值是不同的。 - Manu
谢谢。我需要传递值类型为 'double' 的数值。 - Madhukar Hebbar
使用 long 或 double 类型无法保持较大值的精度。 - Thanigai Arasu
如前面的评论所建议,使用BigDecimal吗? - Anthony Corrado
@ThanigaiArasu:一个 long 可以很好地存储这些值。 - Keppil
@Keppil 是的,我看到了! - Thanigai Arasu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接