Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/223.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
Android 十进制国家问题_Android_Numberformatexception_Decimalformat - Fatal编程技术网

Android 十进制国家问题

Android 十进制国家问题,android,numberformatexception,decimalformat,Android,Numberformatexception,Decimalformat,我的应用程序中有以下代码行,可以将我的百分比四舍五入到合理的长度 double percentage = ((double)correct*100)/((double)total); DecimalFormat df = new DecimalFormat("#.0"); percentage = Double.valueOf(df.format(percentage)); 这段代码99%的时间运行良好,但当一些欧洲国家的人使用它时,它崩溃了,这给了我一个NumberFormatExcepti

我的应用程序中有以下代码行,可以将我的百分比四舍五入到合理的长度

double percentage = ((double)correct*100)/((double)total);
DecimalFormat df = new DecimalFormat("#.0");
percentage = Double.valueOf(df.format(percentage));
这段代码99%的时间运行良好,但当一些欧洲国家的人使用它时,它崩溃了,这给了我一个NumberFormatException

这是因为当DecimalFormat将double 56.7777四舍五入时,它会用逗号将其四舍五入为56,8,这意味着当我试图将其转换为double时,会抛出NumberFormatException

有没有办法将一个位置设置为DecimalFormat,这样我就知道它将始终是56.8,而不是56,8

您需要根据区域设置获取十进制分隔符


您需要根据区域设置获取十进制分隔符。您可以为测试值设置货币,然后格式化并查找是否有逗号或逗号。如果,

DecimalFormat测试=新的DecimalFormat0.00; test.setCurrencyc

字符串testsample=test.format1.23;
char ch=sample.indexOf.>0 ? . : ,;

您可以为测试值设置货币,然后格式化并查找是否有逗号或逗号。如果,

DecimalFormat测试=新的DecimalFormat0.00; test.setCurrencyc

字符串testsample=test.format1.23;
char ch=sample.indexOf.>0 ? . : ,;

使用相同的数字格式解析数据

percentage = df.parse(df.format(percentage), new ParsePosition(0))
另一个解决方案是设置自己的格式符号

DecimalFormat df = new DecimalFormat('#.0', new DecimalFormatSymbols())

我推荐第一种解决方案。我在使用逗号作为十进制分隔符的区域设置上测试了它。

使用相同的数字格式来解析数据

percentage = df.parse(df.format(percentage), new ParsePosition(0))
另一个解决方案是设置自己的格式符号

DecimalFormat df = new DecimalFormat('#.0', new DecimalFormatSymbols())

我推荐第一种解决方案。我在使用逗号作为小数分隔符的区域设置上对其进行了测试。

将小数转换为字符串并应用于它

str = str.replaceAll(",","."); // or "\\.", it doesn't matter...

它将把全部转换为。

将十进制转换为字符串并应用于它

str = str.replaceAll(",","."); // or "\\.", it doesn't matter...

问题在于,您使用DecimalFormat指定了一种自定义格式,然后使用默认语言环境指定的格式解析生成的字符串

您有几个选项可以解决此问题:

使用相同的DecimalFormat对象格式化和解析数字

使用不同的舍入算法。例如:

double roundToHundredths(double d) {
    return (int)(d * 100) / 100.0;
}
将数字存储为整数,单位为百分之一。使用此整数进行计算,并将其显示为十进制

使用BigDecimal可获得更高的精度


请注意,在任何进一步的计算中使用四舍五入的数字仍然很棘手,因为浮点数是不精确的。这意味着舍入的结果不一定是精确的。

问题在于您使用DecimalFormat指定了一种自定义格式,然后使用默认语言环境指定的格式解析结果字符串

您有几个选项可以解决此问题:

使用相同的DecimalFormat对象格式化和解析数字

使用不同的舍入算法。例如:

double roundToHundredths(double d) {
    return (int)(d * 100) / 100.0;
}
将数字存储为整数,单位为百分之一。使用此整数进行计算,并将其显示为十进制

使用BigDecimal可获得更高的精度


请注意,在任何进一步的计算中使用四舍五入的数字仍然很棘手,因为浮点数是不精确的。这意味着舍入的结果不一定是精确的。

我确实考虑过用A替换逗号,但是我担心如果有一个1000的数字会发生什么,那么它会变成1.000。这个代码片断的目的是什么?您是否正在尝试四舍五入到某个小数位数?你对结果做了什么?它是用于其他计算还是只是显示?@MonadNewb-是的,我试图对一个数字进行四舍五入,结果用于这两个方面,它被显示并用于计算其他一些东西。我相信你理解浮点数的问题。如果没有,我建议你仔细阅读。即使在四舍五入之后,百分比也不能保证保持您期望的准确值。我在回答中列出了两种备选方案,并建议您检查每种方案的权衡。@MonadNewWB-我了解到,在小数点后6位左右,双精度将开始降低,但是这是否会影响小数位数的精度呢?我会在浮点上进行阅读,因为我的知识基本上是考虑用A替换逗号,但是我担心如果有1000的数字会发生什么,这段代码的目的是什么?您是否正在尝试四舍五入到某个小数位数?你对结果做了什么?它是用于其他计算还是只是显示?@MonadNewb-是的,我试图对一个数字进行四舍五入,结果用于这两个方面,它被显示并用于计算其他一些东西。我相信你理解浮点数的问题。如果没有,我建议你仔细阅读o

让他们安静下来。即使在四舍五入之后,百分比也不能保证保持您期望的准确值。我在回答中列出了两种备选方案,并建议您检查每种方案的权衡。@MonadNewWB-我了解到,在小数点后6位左右,双精度将开始降低,但这真的会影响小数点四舍五入到小数点后一位的精度吗?不过,我会读浮点,因为我的知识非常基础,这看起来很有希望,我在英国真的不能尝试,但我会看看它是否与我的位置有关。你可以尝试设置默认的区域设置。Locale.setDefaultLocaleLocale.UK;仅用于测试目的。@jcw或如果结果未显示,则根本不依赖默认区域设置。好的,这看起来很有希望,我在英国不能真正尝试,但我会看看它是否与我的区域设置一起工作。您可以尝试设置默认区域设置。Locale.setDefaultLocaleLocale.UK;仅用于测试目的。@jcw或如果结果未显示,则完全不要依赖默认区域设置。我不知道decimalformat有一个直接到双精度的方法。。。这当然可以,我没有意识到decimalformat有一个直接到双精度的方法。。。当然,ITI确实考虑过用逗号代替逗号,但是我担心如果有一个1000的数字会发生什么,然后变成1000,我确实考虑用A替换逗号,但是我担心如果有1000个数字会发生什么。然后会变成1.000I,根据接受的答案,最终选择第一个选项。幸运的是,这些数字不必非常精确,它们用于计算百分比和平均百分比。我只是为了避免像33.3333和1这样的情况。000000000001@jcw注意,由于计算机存储浮点数的方式,舍入并不能消除这些情况。听起来,您应该只在显示结果时对其进行四舍五入,并在计算平均值时使用原始百分比。虽然,从数学上讲,平均百分比是很有问题的。这听起来比我现在做的更好,我会试试看instead@jcw如果我可以问一下,获取百分比平均值的原因是什么?让用户了解他们过去的平均成绩,并让他们将其与当时的平均成绩进行比较-这就是为什么我不特别关心准确性,根据公认的答案,大多数用户可能不会注意到他们的平均百分比是否比第一个选项低了0.3%。幸运的是,这些数字不必非常精确,它们用于计算百分比和平均百分比。我只是为了避免像33.3333和1这样的情况。000000000001@jcw注意,由于计算机存储浮点数的方式,舍入并不能消除这些情况。听起来,您应该只在显示结果时对其进行四舍五入,并在计算平均值时使用原始百分比。虽然,从数学上讲,平均百分比是很有问题的。这听起来比我现在做的更好,我会试试看instead@jcw如果我可以问一下,获取百分比平均值的原因是什么?让用户了解他们过去的平均成绩,并让他们将其与当时的平均成绩进行比较-这就是为什么我不特别关心准确性,大多数用户可能不会注意到他们的平均百分比是否比应该的低0.3%