2011-03-04 55 views
181

我需要格式化浮点数到“n”个小数位。格式浮点数到小数点后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

回答

499

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

String.format("%.2f", floatValue);

Documentation

+58

请小心,因为String.format取决于您当前的本地配置,您可能无法获得点作为分隔符。首选使用String.format(java.util.Locale.US,“%。2f”,floatValue);' – Gomino 2016-03-02 16:31:09

+5

这个答案给出了一个字符串值,而不是一个浮点值,我不认为是一个好的答案。 – ZhaoGang 2017-03-17 08:21:42

+1

你为什么要强制一个点作为分隔符? – 2017-03-23 10:55:43

36

看看DecimalFormat。你可以很容易地使用它来获取一个数字并给它一个小数位数。

编辑Example

+1

+1。这里是[Android特定文档](http://developer.android.com/reference/java/text/DecimalFormat.html),应该基本相同。 – 2011-03-04 15:49:07

+0

但我需要的结果是一个浮点数,而不是一个字符串。 – seba123neo 2011-03-04 18:29:47

+0

你是说你想绕浮动吗?通常情况下,浮动的唯一时间精度是重要的。 – 2011-03-04 19:03:29

1

我想你想IST

return value.toString(); 

,并使用返回值显示的内容。

value.floatValue(); 

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

+0

但我需要的结果是一个浮点数,而不是一个字符串。 – seba123neo 2011-03-04 18:30:20

+1

如果你需要一个浮点数来显示给用户,那么应用程序的设计可能会出现问题。通常浮点数用于计算,并使用字符串将其显示给用户。 – n3utrino 2011-03-05 08:04:38

+0

对不起,您是对的,我很困惑,只是在屏幕上显示时格式化数字,而不是之前,这是我的问题,非常感谢,解决了问题。 – seba123neo 2011-03-07 22:41:09

14

试试这个这对我帮助很大

BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP); 

结果将是 roundfinalPrice - > 5652.26

+2

对于那些希望围绕它进行进一步计算的人来说,这更有用,否则,Arve的答案可能是最好的。 – Gerard 2013-05-27 17:13:41

+0

适合我。 – ZhaoGang 2017-03-17 08:28:01

4

有趣的是,没有人指出直接做到这一点,这很容易。

double roundToDecimalPlaces(double value, int decimalPlaces) 
{ 
     double shift = Math.pow(10,decimalPlaces); 
     return Math.round(value*shift)/shift; 
} 

很确定这不会做半 - 甚至四舍五入。

值得一提的是,只要您将基于二进制的浮点值与基10算术混合,半均匀舍入就会变得混乱且不可预知。我很确定它不能完成。基本问题是像1.105这样的值不能完全用浮点数表示。浮点值将会是1.105000000000001或1.104999999999999。因此,任何尝试执行半均匀舍入都会影响代表性编码错误。

IEEE浮点实现将执行半舍入,但它们执行二进制半舍入,而不是小数半舍入。所以,你可能确定

+0

我也使用过这种方法了一段时间,但我会认为'pow'是一个过于昂贵的操作来用于舍入? – Xerus 2017-10-27 13:56:33

+0

在实际发生性能问题之前不要进行优化。更重要的是要比快速。我不能诚实地想象一个应用程序,其中控制四舍五入的表现会成为一个问题,除非你是维萨或万事达卡(谁只会扔更多的机器)。 pow()可能比round()更快。 – 2017-10-28 21:57:36

1
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(); 
    } 
3

下面是使用由尼克提到DecimalFormat类的快速采样。

float f = 12.345f; 
DecimalFormat df = new DecimalFormat("#.00"); 
System.out.println(df.format(f)); 

打印语句的输出将是12.35。请注意,它会为你整理它。

+0

值得注意的是,不推荐使用'DecimalFormat'构造函数,请参阅我的答案以正确使用'NumberFormat'。 – FBB 2016-06-17 10:11:08

10

值得注意的是,不鼓励使用DecimalFormat构造函数。此类的javadoc指出:

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

https://docs.oracle.com/javase/8/docs/api/java/text/DecimalFormat.html

所以你需要做的是(例如):

NumberFormat formatter = NumberFormat.getInstance(Locale.US); 
formatter.setMaximumFractionDigits(2); 
formatter.setMinimumFractionDigits(2); 
formatter.setRoundingMode(RoundingMode.HALF_UP); 
Float formatedFloat = new Float(formatter.format(floatValue)); 
2

这是一个专业的要少得多和更昂贵的方式,但它应该是更容易理解和更对初学者有帮助。

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