如何在Java中设置浮动或双精度的自定义小数位数



可能重复:
如何在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

使用此

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,导致float中的重分析错误(

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

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解析为double。Double和float是不同的。

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

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

可能的伪代码如下:

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));
    }
}

相关内容

  • 没有找到相关文章

最新更新