关于数据小数位数的四舍五入及小数位数的截断做法

fanxiubin 2010-01-13 10:47:32



在平时的项目开发过程中,经常需要对浮点数的小数位数进行截取,这涉及两方面的问题
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
...全文
550 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
clariones 2010-09-14
  • 打赏
  • 举报
回复

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

想问一下,这种做法和楼主的做法,差别在哪里?
这样是不是由于精度问题,有时候会算错呢?
janwin 2010-09-14
  • 打赏
  • 举报
回复
有点问题
阿_布 2010-01-14
  • 打赏
  • 举报
回复
jf
lilianplayer_163 2010-01-14
  • 打赏
  • 举报
回复
先记下了
holsten32 2010-01-13
  • 打赏
  • 举报
回复
fanxiubin 2010-01-13
  • 打赏
  • 举报
回复
更正一下,roundNumber()应为:
/**
* 对数据的小数位数进行四舍五入(非截断)
* @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;
}
小小都不懂 2010-01-13
  • 打赏
  • 举报
回复
学习了 接分 呀 呵呵
zhuzeitou 2010-01-13
  • 打赏
  • 举报
回复
我觉得如果是从float->float或者double->double的话,不需要用到BigDecimal,如果需要反复调用的话,对效率的影响是蛮大的;如果本身就是高精度的话,那还是用BigDecimal的好

就拿你举的这两个例子
引用
1:在截取小数位数时,对多出的小数位直接截断,不四舍五入,
如 float a = 3.2359f;当要保留三位小数时,截取后的数应为 a = 3.235f;

2:在截取小数位数时,对多出的小数位进行四舍五入后再截断,
如 float a = 3.2359f;当要保留三位小数时,截取后的数应为 a = 3.236f;


对于1
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
SambaGao 2010-01-13
  • 打赏
  • 举报
回复
学习了。jf
苍蝇①号 2010-01-13
  • 打赏
  • 举报
回复
谢谢lz,lz好认真啊
jf

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧