【问题标题】:Double.parseDouble loses a decimal placeDouble.parseDouble 丢失小数位
【发布时间】:2019-05-21 11:32:12
【问题描述】:

我遇到了一个我无法解决的问题。尝试了网站上描述的各种解决方案,但没有结果。 我正在传递一个字符串“total”,它转换为 30.00,但在 Doubleparse 上它更改为 30.0

我需要双精度为30.00,因为它必须添加到数组列表中,并且还显示为文本,如30.00 而不是30.0

我试过了

DecimalFormat df = new DecimalFormat("#.##");
Double number_total = Double.parseDouble(df.format(total));

错误:java.lang.IllegalArgumentException:坏类:类 java.lang.String 在 java.text.NumberFormat.format(NumberFormat.java:304) 在 java.text.DecimalFormat.format(DecimalFormat.java:702) 在 java.text.Format.format(Format.java:93) 在 com.example.jc.salesman.MainActivity.Totais(MainActivity.java:338) 在 com.example.jc.salesman.MainActivity$2.onClick(MainActivity.java:235)

String strSum = ((String.format("%.2f", Double.toString(sum))));

错误:进程:com.example.jc.salesman,PID:26845 java.util.IllegalFormatConversionException: %f 无法格式化
java.lang.String 参数 在 java.util.Formatter.badArgumentType(Formatter.java:1489) 在 java.util.Formatter.transformFromFloat(Formatter.java:2038) 在 java.util.Formatter.transform(Formatter.java:1465) 在 java.util.Formatter.doFormat(Formatter.java:1081) 在 java.util.Formatter.format(Formatter.java:1042) 在 java.util.Formatter.format(Formatter.java:1011) 在 java.lang.String.format(String.java:1999) 在 java.lang.String.format(String.java:1973) 在

com.example.jc.salesman.MainActivity.Totais(MainActivity.java:368)

我什至在 main 中强制使用 Locale,

Locale.setDefault(new Locale("en", "US"));

请帮忙:)

public void Total (String total){

    Log.d("log2","total: " + total);// it prints 30.00

    Double number_total = Double.parseDouble(total);

    Log.d("log2","number_total: " + total);// it prints 30.0
    losing a decimal place.

    array_Total.add (number_total); //Arraylist<Double
    sum (double) = sum + number_total;
    String strSum = (Double.toString(sum));
    total.setText (strSum);
}

【问题讨论】:

  • double 30.0 与 double 30.00 或 double 30D 相同 - 都是完全相同的数字,只是文本表示不同 - 这不是解析问题) - 你想要什么是字符串30.00 - 所以试试String.format("%.2f", sum);(格式化双精度,而不是字符串)

标签: java android double decimal


【解决方案1】:

您错误地使用了df.format()。从javadoc 开始,DecimalFormat 的 .format() 方法接受一个数字(double、long 或 Object,它是 Number 的子类)。

您可以做的是正常解析和存储双精度(30.0)。当您确实需要输出双精度时,您可以使用字符串格式化程序进行输出,例如String.format("%.2f", val)

【讨论】:

    【解决方案2】:

    使用String.format("%.2f", doubleValue) 将其设置为小数点后两位。但它也会将您的其他十进制值四舍五入为 2 个小数点(例如:30.2345 --> 30.23),因此如果您想保留十进制值,请有条件地进行。

    【讨论】:

    • 谢谢我用过。如果字符串是 30.55,那么所有写入都可以,但是当两位小数为 0 时,它只写入一位小数。我可以忍受它并继续前进。这只是美学
    猜你喜欢
    • 2015-08-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2020-05-16
    • 2018-02-26
    相关资源
    最近更新 更多