Java浮点数123.129456转换成123.12而不进行四舍五入。

9

在Java中,如何将float类型的数字保留两位小数,而不使用四舍五入?

123.99999 to 123.99
-8.022222 to -8.02

不应该四舍五入,只需截取小数位并保留两位。

第二点是如何验证或计算小数点后有多少位数字:

123.99 will give true or 2
123.999 will give false or 3

更新

这里输入的数字为字符串,因此我会按照建议使用这种方法;如果有任何异常,我将使用int尝试/捕获块。欢迎提供任何更聪明的操作建议:

public static float onlyTwoDecimalPlaces(String number) {
    StringBuilder sbFloat = new StringBuilder(number);
    int start = sbFloat.indexOf(".");
    if (start < 0) {
        return new Float(sbFloat.toString());
    }
    int end = start+3;
    if((end)>(sbFloat.length()-1)) end = sbFloat.length();

    String twoPlaces = sbFloat.substring(start, end);
    sbFloat.replace(start, sbFloat.length(), twoPlaces);
    return new Float(sbFloat.toString());
}

浮点数不是这样工作的。请阅读例如http://www.scribd.com/doc/5836/What-Every-Computer-Scientist-Should-Know-About-FloatingPoint-Arithmetic - Karl Knechtel
5个回答

9

当您使用 DecimalFormat 时,请注意许多语言使用“,”而不是“.”表示浮点数。因此,尽管您将浮点数格式化为“0.00”,但在某些语言环境中(如德语和波兰语),它将变为“0,00”。这将导致您在 Android 应用程序中使用此新格式化的浮点数时出现 NullPointerException。因此,我所做的是先将它乘以100再转换为整数,然后将其重新转换为浮点数并除以100,以避免四舍五入。 以下是该行代码:

myFloat = (float)((int)( myFloat *100f))/100f;

您可以使用日志进行尝试:

float myFloat = 12.349;
myFloat = (float)((int)( myFloat *100f ))/100f;
Log.d(TAG, " myFloat = "+ myFloat);       //you will get myFloat = 12.34

这段代码将会把myFloat保留两位小数并转换为字符串形式,格式为"0.00"。它不会像这行代码(myFloat = Math.round(myFloat *100.0)/100.0;)那样四舍五入,而是直接截取小数点后两位。


6
请记住,浮点数浮点值。因此,某些数字可能甚至没有确切的两位小数表示。
话虽如此,您可以尝试以下内容:
float f = -8.022222f;
BigDecimal bd = new BigDecimal(f);
BigDecimal res = bd.setScale(2, RoundingMode.HALF_UP);
f = res.floatValue();
System.out.println(f);

你可能需要使用不同的RoundingMode,这取决于你想要什么。


4

首先,仅因为浮点数可以精确表示 a.bcde,并不能保证它一定能精确表示 a.bc

因此,如果你只是想要打印部分,那么如何使用字符串操作呢?使用 indexOf 找到小数点,并使用 substring 提取带有两个小数位的部分。


4
请尝试这个,这个适合你。
double d = 16.66667;
DecimalFormat decimalFormat= new DecimalFormat("#.##");
decimalFormat.setRoundingMode(RoundingMode.FLOOR);
System.out.println("Result :"+decimalFormat.format(d));

2

使用DecimalFormat的简单方法:

DecimalFormat df = new DecimalFormat("0.00");
float f = -8.0222222f;
f = Float.parseFloat(df.format(f));
System.out.println(f);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接