Java大十进制数格式异常
为什么下面的代码抛出java数字格式异常Java大十进制数格式异常,java,exception,bigdecimal,Java,Exception,Bigdecimal,为什么下面的代码抛出java数字格式异常 BigDecimal d = new BigDecimal("10934,375"); 问题是BigDecimal的构造函数需要十进制数格式,其中小数紧跟在小数点之后,而不是十进制逗号,,因此此特定情况下的正确格式为: BigDecimal d = new BigDecimal("10934.375"); 是的,BigDecimal类在其构造函数中不考虑任何区域设置,该构造函数使用字符串,可以在该构造函数的Javadoc中读取: 分数由一个小数点后跟
BigDecimal d = new BigDecimal("10934,375");
问题是
BigDecimal
的构造函数需要十进制数格式,其中小数紧跟在小数点
之后,而不是十进制逗号,
,因此此特定情况下的正确格式为:
BigDecimal d = new BigDecimal("10934.375");
是的,
BigDecimal
类在其构造函数中不考虑任何区域设置
,该构造函数使用字符串
,可以在该构造函数的Javadoc中读取:
分数由一个小数点后跟零或多个小数点组成
十进制数字
如果要根据不同的区域设置进行分析,即使用逗号作为小数分隔符的区域设置,则需要将java.text.DecimalFormat
与特定的区域设置一起使用
例如:
DecimalFormat fmt = new DecimalFormat("0.0", new DecimalFormatSymbols(Locale.GERMAN));
fmt.setParseBigDecimal(true);
BigDecimal n = (BigDecimal) fmt.parse("10934,375");
注意:您需要获取DecimalFormat
(NumberFormat
的子类)的实例才能调用方法setParseBigDecimal
。否则,它将返回一个双精度
,即二进制浮点数和二进制浮点数。因此,在许多情况下,这会导致准确性下降。您可以使用NumberFormat选择区域设置,请参见示例:
String numberToFormat = "1.900,35";
NumberFormat formatter = NumberFormat.getNumberInstance(Locale.GERMAN);
Number number = formatter.parse(numberToFormat);
BigDecimal decimal = BigDecimal.valueOf(number.doubleValue());
太好了,你问了这个问题,马上就回答了。为什么会这样?也许是为了分享信息?我花了很长时间才解决了代码中的问题。@Octopus:。听到这个消息真是太好了:)我对你的问题和答案投了赞成票。我还了解到,德语地区使用逗号表示小数点,而不是dot@Octopus除了英国以外,大多数欧洲国家都有。我自己的国家没有固定的语言环境。示例:我清楚地了解到,这将导致精度损失,因为double
无法准确地表示许多小数。如果我没有转换成双倍,请纠正我确实失去了准确性你称之为准确性而不是精确性(在科学意义上)是正确的。我已经更新了我的答案。