Java大十进制数格式异常

The*_*mer 12 java exception bigdecimal

为什么下面的代码抛出了java数字格式异常?

BigDecimal d = new BigDecimal("10934,375");
Run Code Online (Sandbox Code Playgroud)

Erw*_*idt 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");
Run Code Online (Sandbox Code Playgroud)

注意:您需要获取DecimalFormat(子类NumberFormat)的实例才能调用该方法setParseBigDecimal.否则它返回一个Double替代,它是一个二进制浮点数,并且二进制浮点数不能准确地表示许多小数部分.因此,在许多情况下会导致精度损失.


The*_*mer 8

问题是构造函数BigDecimal需要十进制数格式,其中小数点后面是十进制点.而不是十进制逗号,,所以这个特定情况的正确格式是:

BigDecimal d = new BigDecimal("10934.375");
Run Code Online (Sandbox Code Playgroud)

  • 可能分享信息?我花了很长时间才解决了我的代码中的问题. (4认同)
  • @Octopus:[自我回答一个问题](http://blog.stackoverflow.com/2011/07/its-ok-to-ask-and-answer-your-own-questions/) [鼓励](http ://meta.stackexchange.com/questions/2706/posting-and-answering-questions-you-have-already-found-the-answer-to RQ = 1). (3认同)
  • 太好了,您问了这个问题并立即回答了。为什么? (2认同)