【问题标题】:Convert string to decimal number with 2 decimal places in Java在Java中将字符串转换为小数点后2位的十进制数
【发布时间】:2013-07-02 03:04:10
【问题描述】:

在 Java 中,我试图将格式为 "###.##" 的字符串解析为浮点数。字符串应始终保留 2 位小数。

即使字符串的值为123.00,浮点数也应该是123.00,而不是123.0

这是我目前所拥有的:

System.out.println("string liters of petrol putting in preferences is " + stringLitersOfPetrol);

Float litersOfPetrol = Float.parseFloat(stringLitersOfPetrol);

DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);

litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));

System.out.println("liters of petrol before putting in editor: " + litersOfPetrol);

打印出来:

string liters of petrol putting in preferences is 010.00 
liters of petrol before putting in editor: 10.0

【问题讨论】:

  • 不要再解析格式化的字符串了吧?
  • setMinimumFractionDigits 听起来更合适。
  • 不要解析为浮点数
  • 使用 float 和 double 无法做到这一点。 BigDecimal 可以做到这一点。
  • 如果不能使用float或double,有没有其他方法可以保留传入字符串的2位小数?

标签: java string floating-point number-formatting


【解决方案1】:

这一行是你的问题:

litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));

在那里,您根据需要将浮点数格式化为字符串,但是随后该字符串再次转换为浮点数,然后您在标准输出中打印的是具有标准格式的浮点数。看看这段代码

import java.text.DecimalFormat;

String stringLitersOfPetrol = "123.00";
System.out.println("string liters of petrol putting in preferences is "+stringLitersOfPetrol);
Float litersOfPetrol=Float.parseFloat(stringLitersOfPetrol);
DecimalFormat df = new DecimalFormat("0.00");
df.setMaximumFractionDigits(2);
stringLitersOfPetrol = df.format(litersOfPetrol);
System.out.println("liters of petrol before putting in editor : "+stringLitersOfPetrol);

顺便说一句,当你想使用小数时,忘记其他人建议的 double 和 float 的存在而只使用 BigDecimal 对象,它会为你省去很多麻烦。

【讨论】:

  • 谢谢!我得到了它 !现在我使用 java.lang.BigDecimal 而不是 float
  • 为什么 Double.parsedouble("2.30") 返回 2.3?而不是 2.30?
  • 不一样吗?
【解决方案2】:

Java 将字符串转换为十进制:

String dennis = "0.00000008880000";
double f = Double.parseDouble(dennis);
System.out.println(f);
System.out.println(String.format("%.7f", f));
System.out.println(String.format("%.9f", new BigDecimal(f)));
System.out.println(String.format("%.35f", new BigDecimal(f)));
System.out.println(String.format("%.2f", new BigDecimal(f)));

打印出来:

8.88E-8
0.0000001
0.000000089
0.00000008880000000000000106383001366
0.00

【讨论】:

    【解决方案3】:

    使用BigDecimal:

    new BigDecimal(theInputString);
    

    它保留所有十进制数字。而且您可以确定确切的表示形式,因为它使用十进制而不是二进制来存储精度/比例/等。

    并且它不会像floatdouble 那样遭受精度损失,除非您明确要求。

    【讨论】:

    • 我怀疑有两位小数,精度损失是个问题
    • 我知道,但是如果您只处理两位小数,这将永远不会成为问题。即使是情报也不是那么不准确。
    • @Arian 即使“只有”两位小数,正如您所说,这是一个问题。由于 IEEE 754 不是以十进制开头,而是以二进制开头。
    • 为什么 Double.parsedouble("2.30") 返回 2.3?而不是 2.30?
    【解决方案4】:

    我只是想确保浮点数在转换该字符串后也有 2 位小数。

    你不能,因为浮点数没有个小数位。它们有二进制位,与小数位不相称。

    如果您想要小数位,请使用小数基数。

    【讨论】:

      【解决方案5】:
      litersOfPetrol = Float.parseFloat(df.format(litersOfPetrol));
      
      System.out.println("liters of petrol before putting in editor : "+litersOfPetrol);
      

      你打印Float here,根本没有格式。

      要打印格式化的浮点数,只需使用

      String formatted = df.format(litersOfPetrol);
      System.out.println("liters of petrol before putting in editor : " + formatted);
      

      【讨论】:

      • 为什么 Double.parsedouble("2.30") 返回 2.3?而不是 2.30?
      【解决方案6】:

      Float.parseFloat() 是问题所在,因为它返回 new float

      返回一个新的浮点数,初始化为指定字符串表示的值,由 Float 类的 valueOf 方法执行。

      您正在格式化只是为了 display 。这并不意味着float 将在内部以相同的格式表示。

      您可以使用java.lang.BigDecimal

      我不知道你为什么要使用parseFloat() 两次。如果您想以某种格式显示float,则只需将其格式化并显示即可。

      Float litersOfPetrol=Float.parseFloat(stringLitersOfPetrol);
      DecimalFormat df = new DecimalFormat("0.00");
      df.setMaximumFractionDigits(2);
      System.out.println("liters of petrol before putting in editor"+df.format(litersOfPetrol));
      

      【讨论】:

        猜你喜欢
        • 2012-02-05
        • 2017-06-09
        • 2015-04-30
        • 1970-01-01
        • 2014-09-08
        • 2018-04-20
        • 1970-01-01
        • 2011-05-23
        • 1970-01-01
        相关资源
        最近更新 更多