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

Java 在不使用SetRoundingMode()的情况下截断浮点值,java,jakarta-ee,formatting,number-formatting,decimalformat,Java,Jakarta Ee,Formatting,Number Formatting,Decimalformat,我正在截断一个浮点数。但是我的值正在四舍五入。我不希望这样。例如,如果我的值是12.989->它应该只打印为12.98。有人能帮忙吗 我不能使用decimal格式的SetRoundingMode,因为它仅在Java1.6中受支持。 我的是1.5JDK。有人能在不使用SetRoundingMode()方法的情况下帮助我吗 String pattern = "##,##0.00"; NumberFormat nf = NumberFormat.getN

我正在截断一个浮点数。但是我的值正在四舍五入。我不希望这样。例如,如果我的值是12.989->它应该只打印为12.98。有人能帮忙吗 我不能使用decimal格式的SetRoundingMode,因为它仅在Java1.6中受支持。 我的是1.5JDK。有人能在不使用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);

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

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();
}

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

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();
}

不知道我是否正确理解了你的问题。但是,如果您想要截断而不向上或向下取整,您可以使用
DecimalFormat df=新的DecimalFormat(“##.##”);

格式(12.912385)

不确定我是否正确理解了您的问题。但是,如果您想要截断而不向上或向下取整,您可以使用
DecimalFormat df=新的DecimalFormat(“##.##”);

格式(12.912385)

你可以使用老办法,乘以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);
它可以完成任务,但必须指定总位数。你们不能只说我要两位小数,我不在乎小数点后的数字。这就是
MathContext
的第一个参数是5,而不是2。如果您选择这种方法,您可以使用
Math.Ceil(Math.log10(x))
快速计算非十进制数字

注:

  • 除法(第一种方法)时,至少一个操作数必须是浮点(浮点或双精度)
  • 在处理字符串(您编写代码)时,假定“.”是十进制分隔符是不安全的
  • 使用Math.floor截断小数仅适用于正值

你可以用老办法,乘以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);
它可以完成任务,但必须指定总位数。你们不能只说我要两位小数,我不在乎小数点后的数字。这就是
MathContext
的第一个参数是5,而不是2。如果您选择这种方法,您可以使用
Math.Ceil(Math.log10(x))
快速计算非十进制数字

注:

  • 除法(第一种方法)时,至少一个操作数必须是浮点(浮点或双精度)
  • 在处理字符串(您编写代码)时,假定“.”是十进制分隔符是不安全的
  • 使用Math.floor截断小数仅适用于正值

关于否定,而不是正则表达式。关于否定,而不是正则表达式。如果你不知道数字是什么,但仍然想实现模式,那该怎么办?这种“老派把戏”在90%以上的情况下都失败了。您不能将浮点值截断为特定的小数位数,因为它们没有小数位数可以截断。@Azfar:您必须知道这些数字是什么意思?始终可以为
MathContext
对象计算
setPrecision
。我必须澄清如何做到这一点吗@EJP:如果我们稍微改变常数,乘法和除法都将以双精度执行:
Math.floor(x*100.0)/100
。AFAIK
double
没有显示前15位的精度损失,我很高兴这对于99%的非科学微积分来说已经足够了。@EmperorOrionii旧技巧在数字已经为2的情况下不起作用,比如Math.floor(9.62*100)/100将产生9.61如果你不知道数字是多少,你仍然想达到这个模式呢?“老派把戏”在90%以上的情况下失败了。您不能将浮点值截断为特定的小数位数,因为它们没有小数位数可以截断。@Azfar:您必须知道这些数字是什么意思?始终可以为
MathContext
对象计算
setPrecision
。我必须澄清如何做到这一点吗@EJP:如果我们稍微改变常数,乘法和除法都将以双精度执行:
Math.floor(x*100.0)/100
。AFAIK
double
没有显示前15位的精度损失,我很高兴这对于99%的非科学微积分来说已经足够了。@EmperorOrionii旧技巧不起作用,当数字数已经是2时,比如数学。floor(9.62*100)/100将得到9.61