1

我在这里截断一个浮点数。但我的值正在四舍五入。我不想要那个。例如,如果我的值是 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);
4

3 回答 3

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))

笔记:

  • 除法(第一种方法)时,至少有一个操作数必须是浮点数(float 或 double)
  • 使用字符串(您编写代码)时,假定 '.' 是不安全的。是小数分隔符
  • 使用 Math.floor 截断小数仅适用于正值
于 2012-05-04T08:20:27.877 回答
0

Not sure If I understood you problem correclty. But If you want to truncate without rounding up or down, you can use just like DecimalFormat df = new DecimalFormat("##.##"); df.format(12.912385);

于 2012-05-04T07:57:01.490 回答
-1

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

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();
}
于 2012-05-04T07:43:37.903 回答