在平时的项目开发过程中,经常需要对浮点数的小数位数进行截取,这涉及两方面的问题
1:在截取小数位数时,对多出的小数位直接截断,不四舍五入,
如 float a = 3.2359f;当要保留三位小数时,截取后的数应为 a = 3.235f;2:在截取小数位数时,对多出的小数位进行四舍五入后再截断,
如 float a = 3.2359f;当要保留三位小数时,截取后的数应为 a = 3.236f;下面是针对这两种情况的做法,如下:情况1:/**
* 对数据的小数位数进行截断(非四舍五入)
* @param inputNum 输入的原始数据
* @param minFractionDigits 保留的小数位数(多出的小数进行截断,不四舍五入)
* @return 返回对原始数据进行小数位数截取后的数字
*/
public static float cutNumber(float inputNum,int minFractionDigits)
{
System.out.println("-------对数据的小数位数进行截断(非四舍五入)操作--------");
System.out.println("输入参数: ");
System.out.println("inputNum: " + inputNum);
System.out.println("minFractionDigits: " + minFractionDigits);
float value = (new BigDecimal(inputNum).setScale(
minFractionDigits, BigDecimal.ROUND_DOWN)).floatValue();
System.out.println("输出结果: ");
System.out.println("value: " + value);
return value;
}运行后的结果为:-------对数据的小数位数进行截断(非四舍五入)操作--------
输入参数:
inputNum: 23.2369
minFractionDigits: 3
输出结果:
value: 23.236
情况2:/**
* 对数据的小数位数进行四舍五入(非截断)
* @param inputNum 输入的原始数据
* @param minFractionDigits 保留的小数位数(多出的小数四舍五入,非截断)
* @return 返回对原始数据进行小数位数四舍五入后的数字
*/
public static String roundNumber(float inputNum,int minFractionDigits)
{
System.out.println("-------对数据的小数位数进行四舍五入(非截断)操作--------");
System.out.println("输入参数: ");
System.out.println("inputNum: " + inputNum);
System.out.println("minFractionDigits: " + minFractionDigits);
float value = (new BigDecimal(inputNum).setScale(
minFractionDigits, BigDecimal.ROUND_HALF_UP)).floatValue();
System.out.println("输出结果: ");
System.out.println("value: " + value);
return null;
}运行结果为:-------对数据的小数位数进行四舍五入(非截断)操作--------
输入参数:
inputNum: 23.2369
minFractionDigits: 3
输出结果:
value: 23.237
/**
* 对数据的小数位数进行四舍五入(非截断)
* @param inputNum 输入的原始数据
* @param minFractionDigits 保留的小数位数(多出的小数四舍五入,非截断)
* @return 返回对原始数据进行小数位数四舍五入后的数字
*/
public static float roundNumber(float inputNum,int minFractionDigits)
{
System.out.println("-------对数据的小数位数进行四舍五入(非截断)操作--------");
System.out.println("输入参数: ");
System.out.println("inputNum: " + inputNum);
System.out.println("minFractionDigits: " + minFractionDigits);
float value = (new BigDecimal(inputNum).setScale(
minFractionDigits, BigDecimal.ROUND_HALF_UP)).floatValue();
System.out.println("输出结果: ");
System.out.println("value: " + value);
return value;
}
public static float cutNumber(float inputNum, int minFractionDigits) {
float floatTemp = inputNum;
floatTemp *= Math.pow(10, minFractionDigits);
floatTemp = (int) floatTemp;
floatTemp /= Math.pow(10, minFractionDigits);
return floatTemp;
}对于2
public static float roundNumber(float inputNum, int minFractionDigits) {
float floatTemp = inputNum;
floatTemp *= Math.pow(10, minFractionDigits);
floatTemp += 0.5;
floatTemp = (int) floatTemp;
floatTemp /= Math.pow(10, minFractionDigits);
return floatTemp;
}测试:
System.out.println(cutNumber(23.2369f, 3));
System.out.println(roundNumber(23.2369f, 3));
输出结果:
23.236
23.237
System.out.println(123.556-(123.556 % 0.01));
System.out.println(123.556+0.005-((123.556+0.005) % 0.01));
输出结果:
123.55
123.56想问一下,这种做法和楼主的做法,差别在哪里?
这样是不是由于精度问题,有时候会算错呢?