DecimalFormat 和 Double.valueOf()

2022-09-02 22:45:59

我试图在我的双值的十进制分隔符之后摆脱不必要的符号。我是这样做的:

DecimalFormat format = new DecimalFormat("#.#####");
value = Double.valueOf(format.format(41251.50000000012343));

但是当我运行此代码时,它会抛出:

java.lang.NumberFormatException: For input string: "41251,5"
    at sun.misc.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1224)
    at java.lang.Double.valueOf(Double.java:447)
    at ...

正如我所看到的,像 这样的字符串效果很好,但它在像 .如何解决此问题?有没有比这更优雅的方式Double.valueOf()"11.1""11,1"

Double.valueOf(format.format(41251.50000000012343).replaceAll(",", "."));

有没有办法覆盖类的默认小数分隔符值?还有其他想法吗?DecimalFormat


答案 1

在我的双精度值的十进制分隔符之后删除不必要的符号

你真的是想四舍五入到例如第5个小数吗?然后只需使用

value = Math.round(value*1e5)/1e5;

(当然,如果你真的想把其他数字剪掉,你也可以)Math.floor(value*1e5)/1e5

编辑

使用此方法(或任何浮点的舍入)时要非常小心。对于像265.335这样简单的东西,它失败了。265.335 * 100(2位精度)的中间结果为26533.499999999996。这意味着它被四舍五入到265.33。从浮点数转换为实数十进制数时,存在固有的问题。请参阅EJP的答案 https://stackoverflow.com/a/12684082/144578 - 如何在Java中将数字四舍五入到小数点后n位


答案 2

问题是十进制格式会将值转换为本地化字符串。我猜你的区域设置的默认小数点分隔符是用''。这通常发生在法国地区或世界其他地区。,

基本上,您需要做的是使用“.”分隔符创建格式化日期,以便可以读取它。如注释所示,您也可以使用相同的格式来解析值,而不是使用 。Double.valueOfDouble.valueOf

DecimalFormatSymbols symbols = DecimalFormatSymbols.getInstance();
symbols.setDecimalSeparator('.');
DecimalFormat format = new DecimalFormat("#.#####", symbols);
value = format.parse(format.format(41251.50000000012343));