Java 将浮点设置为小数点后n位

Java 将浮点设置为小数点后n位,java,android,floating-point,numbers,format,Java,Android,Floating Point,Numbers,Format,我需要将浮点设置为小数点后n位 正在尝试使用BigDecimal,但返回值不正确 public static float Redondear(float pNumero, int pCantidadDecimales) { // the function is call with the values Redondear(625.3f, 2) BigDecimal value = new BigDecimal(pNumero); value = value.setScal

我需要将浮点设置为小数点后n位

正在尝试使用BigDecimal,但返回值不正确

public static float Redondear(float pNumero, int pCantidadDecimales) {
    // the function is call with the values Redondear(625.3f, 2)
    BigDecimal value = new BigDecimal(pNumero);
    value = value.setScale(pCantidadDecimales, RoundingMode.HALF_EVEN); // here the value is correct (625.30)
    return value.floatValue(); // but here the values is 625.3
}
我需要返回一个带有指定小数位数的浮点值

我需要
Float
值返回不
Double

.

看一看。您可以很容易地使用它来获取一个数字,并为其指定一组小数位数


编辑:

我想你想要的是

return value.toString();
并使用返回值来显示

value.floatValue();

将始终返回625.3,因为它主要用于计算某些内容。

您也可以传递浮点值,并使用:

String.format(“%.2f”,浮点值)


试试这个这对我帮助很大

BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP);
结果将是
roundfinalPrice-->5652.26

有点奇怪,没有人指出直接的方法,这很简单

double roundToDecimalPlaces(double value, int decimalPlaces)
{
      double shift = Math.pow(10,decimalPlaces);
      return Math.round(value*shift)/shift;
}
很确定,即使是四舍五入,这也不能达到一半

值得一提的是,当您将基于二进制的浮点值与以10为基数的算术混合使用时,半偶数舍入将是混乱和不可预测的。我很确定这是不可能的。基本问题是像1.105这样的值不能用浮点精确表示。浮点值大约为1.105000000000001或1.1049999999999。因此,任何执行半偶数舍入的尝试都会因代表性编码错误而失败


IEEE浮点实现将进行半舍入,但它们进行二进制半舍入,而不是十进制半舍入。因此,您可能还可以

这里有一个使用Nick提到的
DecimalFormat
类的快速示例

public static double roundToDouble(float d, int decimalPlace) {
        BigDecimal bd = new BigDecimal(Float.toString(d));
        bd = bd.setScale(decimalPlace, BigDecimal.ROUND_HALF_UP);
        return bd.doubleValue();
    }
float f = 12.345f;
DecimalFormat df = new DecimalFormat("#.00");
System.out.println(df.format(f));

print语句的输出为12.35。请注意,它将为您取整。

注意,不鼓励使用
DecimalFormat
构造函数。此类的javadoc声明:

通常,不要直接调用DecimalFormat构造函数,因为NumberFormat工厂方法可能返回DecimalFormat以外的子类

因此,您需要做的是(例如):


这是一种不太专业、成本更高的方法,但它应该更容易理解,对初学者更有帮助

public static float roundFloat(float F, int roundTo){

    String num = "#########.";

    for (int count = 0; count < roundTo; count++){
        num += "0";
    }

    DecimalFormat df = new DecimalFormat(num);

    df.setRoundingMode(RoundingMode.HALF_UP);

    String S = df.format(F);
    F = Float.parseFloat(S);

    return F;
}
public static float roundFloat(float F,int roundTo){
字符串num=“##########”;
for(int count=0;count
我一直在寻找这个问题的答案,后来我开发了一种方法:)这是一个合理的警告,它正在将价值四舍五入

private float limitDigits(float number) {
    return Float.valueOf(String.format(Locale.getDefault(), "%.2f", number));
}

如果要将数字格式化为字符串,可以使用十进制格式,例如:

String a = "123455";
System.out.println(new 
DecimalFormat(".0").format(Float.valueOf(a)));
此代码的输出将为:

123455.0



根据需要的输出,您可以在十进制格式中添加更多的零。

+1。这是,基本上应该是一样的。但我需要的结果是一个浮点数,而不是一个字符串。你是说要对浮点数进行四舍五入吗?通常情况下,浮点的唯一时间精度是用来显示的。对不起,你是对的,我很困惑,只是在屏幕上显示数字时格式化,而不是之前,这是我的问题,非常感谢,问题解决了。值得注意的是,不鼓励使用
DecimalFormat
构造函数,请参阅我的答案,了解
NumberFormat
的正确用法。但我需要的结果是一个浮点数,而不是字符串。如果需要浮点数向用户显示,则应用程序的设计可能有问题。通常,浮点数用于计算,字符串用于向用户显示。对不起,你是对的,我很困惑,只需在屏幕上显示数字时设置格式,而不是之前,这是我的问题,非常感谢,问题已解决。这对那些希望取整并使用它进行进一步计算的人更有用,否则,Arve的答案可能是最好的。这也适用于GWT。String.format()-没有。请小心,因为String.format取决于您当前的本地配置,您可能无法使用点作为分隔符。更喜欢使用
String.format(java.util.Locale.US,“%.2f”,floatValue)
这个答案给出的是一个字符串值,而不是浮点值,我认为这不是一个好的答案。为什么要强制使用点作为分隔符?@MarkBuikema我认为在某些情况下,这是绝对必要的,例如在编译由标准驱动的文档格式时,例如PDF文档。值得注意的是,不鼓励使用
DecimalFormat
构造函数,请参阅我的答案以了解
NumberFormat
的正确用法。我也使用此方法一段时间了,但我认为
pow
对于舍入来说是一个太昂贵的操作。在实际出现性能问题之前,不要进行优化。正确比快速更重要。老实说,我无法想象一个应用程序会出现控制舍入的性能问题,除非你是Visa或Mastercard(谁会向它扔更多的机器)。pow()可能比round()快。例如,当floatValue=8.499时,这不起作用。它给出了8.5。@ShivakrishnaChippa:是的,因为这里我们指定逗号后要有两位数字,并进行向上舍入。在这种情况下,8.499四舍五入为8.5。如果希望显示8.499,只需将3设置为最大分数位数。
String a = "123455";
System.out.println(new 
DecimalFormat(".0").format(Float.valueOf(a)));