我的应用程序正在生成Double.toString()生成"-3.1999999999999953"的双打 - 而我希望它生成"-3.2".
我实际上从JScience获得这些双打Amount#getEstimatedValue().
我不想为精度设置任意数量的数字,因为我不知道有多少位数是重要的,但我不希望它产生以"99999999.*"结尾的数字.
如何在没有这个问题的情况下将双打转换为字符串?
推荐解决方案
BigDecimal.valueOf (hisDouble).toPlainString ()
Run Code Online (Sandbox Code Playgroud)
在本文的最后一部分后面提供的hack是在尝试解决OP问题时首先想到的.
然后一个朋友问我在做什么,并说OP更好用BigDecimal,我进入了facepalm模式..
但是我会在这篇文章中留下黑客,以便世界可以看到我有时会有多愚蠢.
打印时可以使用System.out.format.
下面的代码段会将值舍入yourDecimal为一位小数,然后打印该值.
Double yourDouble = -3.1999999999999953;
System.out.format ("%.1f", yourDouble);
Run Code Online (Sandbox Code Playgroud)
产量
-3.2
Run Code Online (Sandbox Code Playgroud)
public static String fixDecimal (Double d) {
String str = "" + d;
int nDot = str.indexOf ('.');
if (nDot == -1)
return str;
for (int i = nDot, j=0, last ='?'; i < str.length (); ++i) {
j = str.charAt (i) == last ? j+1 : 0;
if (j > 3)
return String.format ("%."+(i-nDot-j-1)+"f", d);
last = str.charAt (i);
}
return str;
}
Run Code Online (Sandbox Code Playgroud)
...
Double[] testcases = {
3.19999999999953,
3.145963219488888,
10.4511111112,
100000.0
};
for (int i =0; i < testcases.length; ++i)
System.out.println (
fixDecimal (testcases[i]) + "\n"
);
Run Code Online (Sandbox Code Playgroud)
产量
3.2
3.1459632195
10.45
100000.0
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
660 次 |
| 最近记录: |