为什么下面的代码会抛出一个java数字格式异常?
BigDecimal d = new BigDecimal("10934,375");
答案 0 :(得分:14)
是的,BigDecimal
类在其Locale
的构造函数中不考虑任何String
,可以在此构造函数的Javadoc中读取:
该分数由小数点后跟零或更多组成 十进制数字。
如果要根据使用逗号作为小数分隔符的其他Locale
进行解析,则需要将java.text.DecimalFormat
与特定Locale
一起使用。
示例:
DecimalFormat fmt = new DecimalFormat("0.0", new DecimalFormatSymbols(Locale.GERMAN));
fmt.setParseBigDecimal(true);
BigDecimal n = (BigDecimal) fmt.parse("10934,375");
注意:您需要获取DecimalFormat
(NumberFormat
的子类)的实例才能调用方法setParseBigDecimal
。否则,它将返回Double
,它是二进制浮点数和二进制浮点数cannot accurately represent many decimal fractions。因此,在许多情况下会导致精度下降。
答案 1 :(得分:8)
问题是BigDecimal
的构造函数需要十进制数格式,其中小数点位于小数点.
之后,而不是十进制逗号,
,因此这种特定情况的正确格式为:
BigDecimal d = new BigDecimal("10934.375");
答案 2 :(得分:3)
您可以使用NumberFormat选择区域设置,请参阅示例:
String numberToFormat = "1.900,35";
NumberFormat formatter = NumberFormat.getNumberInstance(Locale.GERMAN);
Number number = formatter.parse(numberToFormat);
BigDecimal decimal = BigDecimal.valueOf(number.doubleValue());