如何在Java中设置一个自定义的十进制数字,在float或double中近似

时间:2012-12-24 00:40:30

标签: java android floating-point floating-accuracy

  

可能重复:
  How to round a number to n decimal places in Java

我想在float(或double)中设置指定的小数位数,使用此形式的方法

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

3 个答案:

答案 0 :(得分: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)

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

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

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

警告

显然你必须传递 float ,因为该方法使用 Float.parseFloat ,如果你想传递 double ,你必须使用在方法中传递之前强制转换为float,否则你必须更改所有方法原语并从float解析为double。 Double和float是不同的。

答案 1 :(得分:0)

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

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

答案 2 :(得分:-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));
    }

}