Java浮点123.129456到123.12没有舍入

Mat*_* B. 6 java floating-point decimal

你如何在java中将float原语减少到两位小数,而不使用舍入?:

123.99999 to 123.99
-8.022222 to -8.02
Run Code Online (Sandbox Code Playgroud)

只有小数点的四舍五入应该没有舍入而留下两个.

第二点是你如何验证或计算点数后的小数位数?:

123.99 will give true or 2
123.999 will give false or 3
Run Code Online (Sandbox Code Playgroud)

UPDATE

数字是字符串输入所以我想我会按照建议去做; 对于任何异常,我都会使用int try/catch块.欢迎任何建议如何以更智能的方式使这项工作:

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());
}
Run Code Online (Sandbox Code Playgroud)

Udi*_*hef 7

当您使用时DecimalFormat要注意许多语言使用","而不是"."这一事实.浮动.因此,虽然您将浮动格式设置为"0.00",但在某些区域设置(例如德语和波兰语)中它将变为"0,00".这将导致一段NullPointerException时间,您将在Android应用程序中使用这个新的格式化浮点数.所以我为了切割而不是舍入而做的是将它与100相乘后再将它重新转换为int然后将其重新设置为float并将其除以100这就是行:

myFloat = (float)((int)( myFloat *100f))/100f;
Run Code Online (Sandbox Code Playgroud)

你可以用日志来试试:

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

这会将myFloat在小数点后的两个位置切换为("0.00")的格式,它不会像这条线(myFloat = Math.round(myFloat *100.0)/100.0;)那样将它切成圆形.


Pab*_*ruz 6

请记住,float浮点值.因此,对于某个数字,甚至可能没有精确的两位十进制表示.

话虽如此,您可以尝试以下方法:

float f = -8.022222f;
BigDecimal bd = new BigDecimal(f);
BigDecimal res = bd.setScale(2, RoundingMode.HALF_UP);
f = res.floatValue();
System.out.println(f);
Run Code Online (Sandbox Code Playgroud)

您可能需要使用不同的RoundingMode.取决于你想要什么.


aio*_*obe 4

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

因此,如果您只需要打印部分,那么通过一些字符串操作来完成它怎么样?使用 查找小数点indexOf并使用 提取小数点后两位的部分substring