1

可能重复:
如何在 Java 中将数字四舍五入到 n 位小数

我想用这种形式的方法在浮点数(或双精度数)中设置指定数量的十进制数字

public float decimalDigits(int x, float n){
....
}

例如

->如果我有

float n1=36.58529

线

float n2=decimalDigits(2, n1);

应该返回

n2=36.59

-> 如果 n1 是:

float n1=36.58329

线

float n2=decimalDigits(2, n1);

应该返回

n2=36.58

线

float n2=decimalDigits(1, n2);

应该返回

n2=36.6

ETC

4

3 回答 3

3

用这个

public float decimalDigits(int decimaldigits, float x){
            final NumberFormat numFormat = NumberFormat.getNumberInstance();
            numFormat.setMaximumFractionDigits(decimaldigits);
            final String resultS = numFormat.format(x);
            String parsable=resultS.replace(".", "");
            parsable=resultS.replace(",", ".");
            float ris=Float.parseFloat(parsable);
            return ris;
        }

我已将字符串替换添加到代码中以避免由点约定引起的解析问题(例如,格式化后 1234.34 变为 1.234,34 导致在浮点中重新解析时出错)

如果你只是一个格式可视化问题,你也可以使用字符串,浮点变量没有小数位并不重要,所以这是另一种有效的方法:

public String decimalDigits(int decimaldigits, float x){
        final NumberFormat numFormat = NumberFormat.getNumberInstance();
        numFormat.setMaximumFractionDigits(decimaldigits);
        final String resultS = numFormat.format(x);
        return resultS;
    }

如果有人对此解决方案的有效性有疑问,应询问详细信息或尝试编译代码并在否决之前对其进行测试,谢谢。代码已经过测试并且工作起来就像一个魅力。

警告

显然,您必须传递float因为该方法使用Float.parseFloat,如果您想传递一个double ,则必须在将其传递给方法之前使用强制转换来浮动,否则您必须更改所有方法原语并从 float 解析为双倍的。双精度和浮点数是不同的。

于 2012-12-24T01:04:39.487 回答
0

float返回 a或 a的例程不可能double返回正确舍入的值,例如 36.59 或 36.6,因为这些值不能用二进制浮点表示。二进制浮点只能返回接近的值,例如 36.60000000000000142108547152020037174224853515625。二进制浮点中没有表示值 36.6 的位模式。

如果需要十进制值,则必须使用十进制基数,例如 DecimalFormat 或 BigDecimal。

于 2012-12-24T00:45:33.230 回答
-1

可能的伪代码如下:

public class test {

    /**
     * @param args
     */
    public static void main(String[] args) {
        System.out.println(decimalDigits(10.09872, 4));
    }

     static double decimalDigits(double value, int n)
    {
        double decimal = value - ((int) value);
        System.out.println(decimal);

        double short_decimal = 0;
        for(int i = 0; i < n; i++)
        {
            /* current digit on decimal */
            decimal = decimal * 10;
            System.out.println(decimal);
            short_decimal += (Math.pow(10, n - i - 1) * (int)decimal);

            /* find further */
            decimal = decimal - (int)decimal;
        }

        return (int)value + (double)(short_decimal / Math.pow(10, n));
    }

}
于 2012-12-24T00:47:20.117 回答