【问题标题】:Java float 123.129456 to 123.12 without roundingJava float 123.129456 到 123.12 没有四舍五入
【发布时间】:2011-02-19 14:41:14
【问题描述】:

如何在不使用舍入的情况下将 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 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());
}

【问题讨论】:

标签: java floating-point decimal


【解决方案1】:

当您使用DecimalFormat 时,请注意许多语言使用“,”而不是“。”这一事实。为浮动。因此,虽然您将浮点数格式化为“0.00”,但在某些语言环境(例如德语和波兰语)中它将变为“0,00”。这将导致NullPointerException,而您将在 android 应用程序中使用这种新的格式化浮点数。所以我为了切割而不是圆形所做的是将它与 100 相乘后将其转换为 int 然后将其重新转换为 float 并将其除以 100 这是一行:

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

你可以用log试试:

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;)那样把它弄圆,它只会剪掉它。

【讨论】:

    【解决方案2】:

    请记住,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);
    

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

    【讨论】:

      【解决方案3】:

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

      所以,如果您只关注打印部分,那么使用一些字符串操作来完成它怎么样?使用indexOf 查找小数点并使用substring 提取具有两位小数的部分。

      【讨论】:

        【解决方案4】:

        使用 DecimalFormat 的简单方法:

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

        【讨论】:

          【解决方案5】:

          请试试这个,这个适合你。

          double d = 16.66667;
          DecimalFormat decimalFormat= new DecimalFormat("#.##");
          decimalFormat.setRoundingMode(RoundingMode.FLOOR);
          System.out.println("Result :"+decimalFormat.format(d));
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-04-23
            • 1970-01-01
            • 1970-01-01
            • 2023-01-12
            • 1970-01-01
            • 2012-08-04
            相关资源
            最近更新 更多