在不使用SetRoundingMode()的情况下截断浮点值

时间:2012-05-04 07:34:54

标签: java java-ee formatting number-formatting decimalformat

我在这里截断一个浮点数。但是我的价值正在变得圆滑。我不想那样。例如我的价值是12.989 - >它应该只打印为12.98。有人可以帮忙吗 我不能使用十进制格式的SetRoundingMode,因为只支持java 1.6。 我的是1.5 JDK。有人帮助我而不使用SetRoundingMode()方法????

        String pattern = "##,##0.00";        
        NumberFormat nf = NumberFormat.getNumberInstance();
        DecimalFormat df = (DecimalFormat)nf;      

        double fPart; 
        Float value=233.989f;
        String dstr = String.valueOf(value);
        dstr = dstr.substring(dstr.indexOf(".")+1);
        Long db = Long.valueOf(dstr);
        if(db > 0){
            df.applyPattern(pattern);
            System.out.println("input="+value+", fPart="+dstr);
        }        

        String output = df.format(value);

    System.out.println(output);

3 个答案:

答案 0 :(得分:2)

你可以随时使用旧学校技巧,乘以10 ^ n,截断,除以10 ^ n:

float x = 233.989f;
x = (float)(Math.floor(x * 100) / 100);

我也尝试过BigDecimal:

MathContext mc = new MathContext(5, RoundingMode.FLOOR)
BigDecimal decimal = new BigDecimal(233.989, mc);
System.out.println(decimal);

它可以完成工作,但您必须指定总位数。你不能只说我想要2位小数而且我不关心小数点左边的数字。这是MathContext的第一个参数是5,而不是2.如果您选择这种方法,您可以使用Math.Ceil(Math.log10(x))快速计算非小数位数。

注意:

  • 当划分(第一种方法)时,至少有一个操作数必须是浮点(浮点或双精度)
  • 使用字符串(代码)时,假定'。'是不安全的。是小数点分隔符
  • 使用Math.floor截断小数仅适用于正值

答案 1 :(得分:0)

不确定我是否理解你的问题。但是如果你想在没有向上或向下舍入的情况下截断,你就可以使用 DecimalFormat df = new DecimalFormat("##.##"); df.format(12.912385);

答案 2 :(得分:-1)

您可以使用正则表达式获取“。”之后的第二个数字。然后从开头到该位置减去字符串,然后将字符串转换为float或double。

Pattern pattern = Pattern.compile("regular expression");
Matcher matcher = pattern.matcher("your string");

if(matcher.find())
{
    int poz_begin = matcher.start();
    int poz_end = matcher.end();
}