java - 不使用 SetRoundingMode() 截断浮点值

标签 java jakarta-ee formatting number-formatting decimalformat

我在这里截断了一个 float 。但是我的值正在四舍五入。我不希望这样。例如,如果我的值是 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);

最佳答案

您始终可以使用老派技巧,乘以 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)) 快速计算非十进制数字。

注意:

  • 除法(第一种方法)时,至少有一个操作数必须是浮点型(float 或 double)
  • 使用字符串(您编码)时,假设“.”是不安全的。是小数点分隔符
  • 使用 Math.floor 截断小数仅适用于正值

关于java - 不使用 SetRoundingMode() 截断浮点值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10444640/

相关文章:

java - 如何从微调器中检索值

java - 如何将数据从 JSF 传递到 Java Applet

Java EE 显示连接池中剩余的连接数

c++ - 如何在 C++ 类中正确排序我的对象

java - JFrame 中的背景图像

java - 如何从 16 位数据中获取 4 位?

java - Libgdx Freetype 字体生成器错误

java - 这个HttpServlet的service()方法到底做了什么?

python - 没有加号的科学记数法

json - 使用 jq 以人类可读格式打印 JSON 数组