在平时的项目开发过程中,经常需要对浮点数的小数位数进行截取,这涉及两方面的问题
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

解决方案 »

  1.   

    更正一下,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;
    }
      

  2.   

    我觉得如果是从float->float或者double->double的话,不需要用到BigDecimal,如果需要反复调用的话,对效率的影响是蛮大的;如果本身就是高精度的话,那还是用BigDecimal的好就拿你举的这两个例子对于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
      

  3.   


        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想问一下,这种做法和楼主的做法,差别在哪里?
    这样是不是由于精度问题,有时候会算错呢?