格式浮点数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
。
您也可以传递浮点值,并使用:
String.format("%.2f", floatValue);
文档
看看DecimalFormat 。 你可以很容易地使用它来取一个数字,并给它一个小数位数。
编辑 : 例子
试试这个帮了我很多
BigDecimal roundfinalPrice = new BigDecimal(5652.25622f).setScale(2,BigDecimal.ROUND_HALF_UP);
结果将是roundfinal价格 – > 5652.26
值得注意的是,不鼓励使用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));
有点惊讶没有人指出直接的做法,这很容易。
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浮点实现将做半舍入,但他们做二进制半舍入,而不是小数半舍入。 所以你可能没问题
下面是使用Nick提到的DecimalFormat
类的一个快速示例。
float f = 12.345f; DecimalFormat df = new DecimalFormat("#.00"); System.out.println(df.format(f));
打印语句的输出将是12.35。 注意它会围绕你。
我想你想要的是什么
return value.toString();
并使用返回值来显示。
value.floatValue();
将永远返回625.3,因为它主要用来计算一些东西。
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(); }
这是一个不太专业和更昂贵的方式,但应该更容易理解,对初学者更有帮助。
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; }