如何以一定的精度读取double值

时间:2010-06-04 06:37:46

标签: java

如何使用此api

假设字符串包含类似“10.1234”的字符串,从具有一定精度的字符串中读取double值(例如4)

5 个答案:

答案 0 :(得分:4)

如果您想要小数精度, double是错误的目标类型,因为它是一种无法准确表示大多数小数小数的二进制格式。 double值实际上将四舍五入为10.123399999999999999976

相反,请始终使用BigDecimal,或者在阅读和操作数据时忘记粗略,并在打印结果时将其舍入。

Read The Floating-Point Guide了解更多信息。

答案 1 :(得分:3)

System.out.println(new Double(new BigDecimal("10.123456789").
        setScale(4, BigDecimal.ROUND_DOWN). // choose precision and specify rounding policy
        doubleValue()
        ));

>> run:
10.1234

答案 2 :(得分:0)

您可以执行类似

的操作

Math.round(数字* 100)/ 100

获得精度,但由于浮点数和双精度数的内部表示,这可能无法达到你想要的效果。

如果您确实需要在小数点后使用固定位数,请考虑使用BigDecimal。

对于格式化输出,您可以使用this article中描述的类似C的printf功能。它不漂亮但实用。

答案 3 :(得分:0)

我假设您的String也包含字母。 您可以先解析字符串中的数字:

String numberString = ...
int precision = ...

int index = numberString.indexOf(".");
numberString = numberString.substring(0, index+precision+1); // Maybe without "+1"
Double number = Double.valueOf(numberString);

答案 4 :(得分:0)

您可以使用正则表达式将String截断为小数点后最多4位数,然后使用Double.valueOf

        String[] tests = {
            "12",
            "12.",
            "12.3",
            "12.34",
            "12.345",
            "12.3456",
            "12.34567",
            "-123.45678",
            "1.23456.789.0",
        };
        for (String test : tests) {
            String truncated = test.replaceAll("(\\.\\d{4}).*", "$1");
            System.out.printf("%15s %15s %15s%n",
                test, truncated, Double.valueOf(truncated)
            );
        }

打印:

             12              12            12.0
            12.             12.            12.0
           12.3            12.3            12.3
          12.34           12.34           12.34
         12.345          12.345          12.345
        12.3456         12.3456         12.3456
       12.34567         12.3456         12.3456
     -123.45678       -123.4567       -123.4567
  1.23456.789.0          1.2345          1.2345

正则表达式如何工作

它会将.文字\d{4},后跟最多四位\1标记为.*。它还会匹配$1之后的所有其他内容,并使用\1替换整个内容(反对所捕获的indexOf)。

这比简单的{{1}}方法更有优势的是,即使没有4位数,或者甚至根本没有小数点,它也可以工作,无需特殊处理

另见