【问题标题】:How do I properly parse a string with a float values with a given number of decimal places into an integer?如何正确地将具有给定小数位数的浮点值的字符串解析为整数?
【发布时间】:2020-04-17 23:35:09
【问题描述】:

我有给定小数位数的浮点值。在本例中为小数点后 2 位。

例如:

33.3
134.45

我想从这些字符串中获得以下整数:

3330
13445

我想利用我们预先知道小数位数的事实将这些字符串解析为等效的整数值。在此示例中为 2,因此实际的浮点数/双精度数需要乘以 100。

我尝试了以下代码,但它将33.3 解析为3329 而不是3330

这是我尝试过的代码:

public class HelloWorld{

     public static void main(String []args){

        int decimalDigits = 2;
        String strNumber = "33.3";
        double doubleNumber = Double.parseDouble(strNumber);
        int intNumber = (int)(Double.parseDouble(strNumber) * (double)Math.pow(10,decimalDigits) );

        System.out.println(strNumber);
        System.out.println(doubleNumber);
        System.out.println(intNumber);

     }
}

结果如下:

$javac HelloWorld.java
$java -Xmx128M -Xms16M HelloWorld
33.3
33.3
3329

【问题讨论】:

  • 解析为双倍,乘以 100,然后舍入为整数。或者读取字符串,找到句点,删除它,并根据需要附加零、一个或两个零,以确保句点后面有两位数,然后解析为整数。

标签: java math floating-point precision


【解决方案1】:

为了保持精确,我建议使用BigDecimal

int decimalDigits = 2;
String strNumber = "33.3";
BigDecimal decimalNumber = new BigDecimal(strNumber);
int intNumber = decimalNumber.movePointRight(decimalDigits).intValue();

System.out.println(strNumber);
System.out.println(decimalNumber);
System.out.println(intNumber);

输出:

33.3
33.3
3330

【讨论】:

  • 是否可以使用常规浮点数或双精度数来做到这一点?我需要解析数十万个值,我猜 BigDecimal 比较慢。
  • 不要过早优化。对于当今的技术而言,解析数十万个值已无济于事。
  • 我没有正式测量它,但是对于一个 3-4 秒的解析任务(从文件中解析大约 1000 万个数字),我没有注意到使用 BigDecimal 而不是浮点数有任何性能损失.
【解决方案2】:

使用 BigDecimal:

String res = new BigDecimal("33.3").multiply(new BigDecimal("10"))
  .setScale(0, ROUND_UNNECESSARY)
  .toPlainString()

【讨论】:

    【解决方案3】:

    对于没有BigDecimal 的解决方案,这似乎可行。我将其作为参考,以防其他人发现它有用。我尚未测试哪种解​​决方案更快,如果我遗漏了其他任何内容,欢迎就这种方式对 BigDecimal 使用的潜在问题发表任何评论。

    (int)Math.round(Float.parseFloat(strNumber) * Math.pow(10,decimalDigits));
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-06-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-11-17
      • 2016-10-19
      相关资源
      最近更新 更多