Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/381.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java大十进制数格式异常_Java_Exception_Bigdecimal - Fatal编程技术网

Java大十进制数格式异常

Java大十进制数格式异常,java,exception,bigdecimal,Java,Exception,Bigdecimal,为什么下面的代码抛出java数字格式异常 BigDecimal d = new BigDecimal("10934,375"); 问题是BigDecimal的构造函数需要十进制数格式,其中小数紧跟在小数点之后,而不是十进制逗号,,因此此特定情况下的正确格式为: BigDecimal d = new BigDecimal("10934.375"); 是的,BigDecimal类在其构造函数中不考虑任何区域设置,该构造函数使用字符串,可以在该构造函数的Javadoc中读取: 分数由一个小数点后跟

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

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
无法准确地表示许多小数。如果我没有转换成双倍,请纠正我确实失去了准确性你称之为准确性而不是精确性(在科学意义上)是正确的。我已经更新了我的答案。