我想将前缀为货币符号的可能十进制值转换为仅数值.
例如 -
值可以像以下任何一样
String s1 = "£32,847,676.65";
String s2 = "£3,456.00";
String s3 = "£831,209";
Run Code Online (Sandbox Code Playgroud)
我希望转换后的结果像 - 32847676.65,3456.00和831209.
我尝试用parse()这种方式使用NumberFormat的方法 -
NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.UK);
numberFormat.setMinimumFractionDigits(2);
Number num = nf.parse(s1);
double dd = num.doubleValue();
BigDecimal gg = new BigDecimal(dd);
System.out.println(gg);
Run Code Online (Sandbox Code Playgroud)
但结果是 - 32847676.649999998509883880615234375这不完全是正确的.
我需要它是数字,所以我可以执行某种计算.
你们可以指导我,我还能尝试什么
您已经正确解析了该值.问题是这样的:
BigDecimal gg = new BigDecimal(dd);
Run Code Online (Sandbox Code Playgroud)
您将值存储到BigDecimal,并且双点的舍入问题占点后面的小数位.使用:
BigDecimal gg = new BigDecimal(dd).setScale(2);
Run Code Online (Sandbox Code Playgroud)
要么
BigDecimal gg = new BigDecimal(dd).setScale(2,RoundingMode.HALF_UP);
Run Code Online (Sandbox Code Playgroud)
使用BigDecimal时,相应的构造函数是BigDecimal(String val)
NumberFormat nf = NumberFormat.getCurrencyInstance(Locale.UK);
BigDecimal gg = new BigDecimal(nf.parse(s1).toString());
System.out.println(gg);
Run Code Online (Sandbox Code Playgroud)
BigDecimal(double val)确实构造了double值的精确十进制表示,这不是您期望的人类可读值.
"这个构造函数的结果可能有些不可预测.有人可能会认为在Java中编写新的BigDecimal(0.1)会创建一个BigDecimal,它恰好等于0.1(未缩放值为1,标度为1),但它实际上是等于0.1000000000000000055511151231257827021181583404541015625.这是因为0.1不能精确地表示为double(或者,就此而言,作为任何有限长度的二进制分数).因此,传递给构造函数的值不完全等于0.1尽管如此.[...]因此,通常建议使用String构造函数而不是这个"
| 归档时间: |
|
| 查看次数: |
5616 次 |
| 最近记录: |