Java大十进制数格式exception
为什么下面的代码抛出了java数字格式exception?
BigDecimal d = new BigDecimal("10934,375");
是的, BigDecimal
类在其构造函数中不会将任何Locale
考虑在内,因为可以在此构造函数的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
,这是一个二进制浮点数,二进制浮点数不能准确地表示许多小数 。 因此,在许多情况下会导致精度损失。
问题是BigDecimal
构造函数需要十进制数格式,小数点后面的小数点.
而不是十进制逗号,
所以这个特定情况的正确格式是:
BigDecimal d = new BigDecimal("10934.375");
您可以使用NumberFormat选择Locale,请参阅示例:
String numberToFormat = "1.900,35"; NumberFormat formatter = NumberFormat.getNumberInstance(Locale.GERMAN); Number number = formatter.parse(numberToFormat); BigDecimal decimal = BigDecimal.valueOf(number.doubleValue());