Java 如何以一定的精度读取双精度值

Java 如何以一定的精度读取双精度值,java,Java,如何以一定的精度从字符串中读取双精度值(例如4)假设字符串包含类似10.1234的内容使用此您可以执行以下操作 数学整数*100/100 以获得精度,但由于浮点数和双精度的内部表示,这可能不会达到您想要的效果 如果在小数点之后确实需要使用固定位数,请考虑使用BigDigMal.< /P> 对于格式化输出,可以使用中描述的类似C的printf功能。它并不漂亮,但很实用。我假设您的字符串也包含字母。 System.out.println(new Double(new BigDecimal("10.1

如何以一定的精度从字符串中读取双精度值(例如4)假设字符串包含类似10.1234的内容使用此

您可以执行以下操作

数学整数*100/100

以获得精度,但由于浮点数和双精度的内部表示,这可能不会达到您想要的效果

如果在小数点之后确实需要使用固定位数,请考虑使用BigDigMal.< /P>


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

我假设您的字符串也包含字母。
System.out.println(new Double(new BigDecimal("10.123456789").
        setScale(4, BigDecimal.ROUND_DOWN). // choose precision and specify rounding policy
        doubleValue()
        ));

>> run:
10.1234
您可以首先从字符串中解析数字:

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

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

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

这张照片是:

             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反向引用

与简单的indexOf方法相比,这种方法的优点是,即使没有4位数字,或者甚至没有小数点,它也可以工作,而无需特殊处理

另见
如果需要十进制精度,则double是错误的目标类型,因为它是一种二进制格式,无法准确表示大多数十进制整数。这个双精度值实际上会四舍五入到10.123399999999976

相反,请始终使用BigDecimal,或者在读取和操作数据时忘记运行,只在打印结果时对其进行四舍五入


有关详细信息。

或者您可以使用BigDecimal。当您有一个正确的十进制类型时,没有很好的理由在cents hack中使用计算。
             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