我有一个double val
,我试图把它变成浮动(导致我需要传递它的函数接下来浮动)但是我失败了。
我试过a)把它变成双倍,然后用Float.parseFloat
和b)把它变成一个字符串。
以下是我的代码:
DecimalFormat df = new DecimalFormat("#.##");
df.setMaximumFractionDigits(2);
df.setRoundingMode(RoundingMode.CEILING);
Log.i(TAG, "FORMAT = " +df.format(val) );
String valString = String.valueOf(df.format(val));
Log.i(TAG, "valString == " + valString );
float val2 = Float.parseFloat(valString);
但是当我将double或String传递给Float.parseFloat
时,我会恢复之前的浮点值。
示例:
FORMAT = 42.86
valString == 42.86
val== 42.857142857142854 **** why?
答案 0 :(得分:1)
您使用的是floating-point种类型。浮点是一种计算方法,用于表示分数,以便以计算速度的精度进行折衷。该方法使用十进制数的二进制表示,但此表示不能完美匹配所有数字。因此,您会在分数中看到此类异常额外数字。
字符串格式化是一种分心。真正的问题是了解数字计算机如何处理数字。
BigDecimal
当您关心准确性时,请使用BigDecimal
类而不是浮点类型。慢得多但准确。
此类可以在需要时生成浮点数,但请记住,并非每个十进制数都可以表示为浮点数。
示例用法:
BigDecimal
。