【问题标题】:How to round decimal part of number so it doesn't affect whole the part of number? [duplicate]如何舍入数字的小数部分,使其不影响整个数字部分? [复制]
【发布时间】:2022-08-10 22:59:57
【问题描述】:

我有这个 BigDecimal 数字 - 68.65121847597993,我想像这样舍入它 - 68.7,所以只有数字的小数部分会被舍入,而不是整数。

我尝试使用 RoundingMode.HALF_UP 但它也将整数四舍五入。 有没有办法使用java只舍入数字的小数部分?

  • 您想实际修改数字还是简单地提供数字的四舍五入表示?

标签: java bigdecimal


【解决方案1】:

为了表示具有那么多小数点的数字,我假设您使用的是BigDecimal 而不是double,它只能准确地表示大约15 significant digits

BigDecimal 开始,您可以使用字符串、双精度数或其他任何您拥有的东西进行初始化,您可以调用BigDecimal::setScale 来获取您想要的值。

例如:

import java.math.*;

public class HelloWorld {
  public static void main(String []args){
    BigDecimal b = new BigDecimal("68.65121847597993");
    BigDecimal rounded = b.setScale(2, RoundingMode.HALF_UP);
    System.out.println(rounded);  // 68.65
  }
}

【讨论】:

  • -68.65121847597993(及其正变体 68.65121847597993)非常适合 double
  • 它在刀刃上,进入危险的领域。例如。 ```双a = 68.65121847597993;双b = -68.651218475979931; System.out.println(a == -b); // 真 ``
  • floatdouble== 进行比较总是“在刀刃上”;-) 但我明白你的意思。我想 OP 从之前实际上使用双值的代码中复制了该数字,但也许我错了 - 所以你的回答真的很有帮助!
【解决方案2】:

我会像几乎所有其他语言一样这样做:

double input = -68.65121847597993;
double rounded = Math.floor(input * 10.0 + 0.5)/10.0;

使用BigDecimal,您有更多选项,如舍入模式和setScale,如果您需要的话。

还有像decimal4jApache Commons Math 这样的第三方库——尽管我没有测试它们。

【讨论】:

  • @LinFelix 你试过我的代码了吗?我承认我忽略了负号,所以我更新了我的答案,但它用负号返回-68.7。这是由于 Math.floor() 的性质,它不会截断,而是向下舍入到下一个较小的整数,如果输入为 -687.0,则如本例所示,如果输入为 -686.0121847597993。
【解决方案3】:

你应该试试这个

 DecimalFormat df = new DecimalFormat("###.###");

这是一篇关于它的Baeldung文章: https://www.baeldung.com/java-round-decimal-number

希望能帮助到你!

【讨论】:

    【解决方案4】:

    你不能真正做到这一点,因为浮点数和双打不是那样工作的。

    但是,这可以解决您的问题:

    round((-68.65121847597993)*10)/10f;
    

    另见:Java float 123.129456 to 123.12 without rounding

    【讨论】:

    • 您的示例无法完全正常工作:您将doubleintfloat 混为一谈:如果将结果再次分配给double,则除以10f 得出-68.69999694824219 的结果.仅将其分配给 float 会产生正确的结果。始终注意自动转换和混合数字类型。
    • 是的,我必须承认这不是一个很好的解决方案
    【解决方案5】:

    如果您的值为双精度值,则此方法的编译时间最短:

    Math.round(num * 10d) / 10d
    

    0 的个数 = 小数位数

    【讨论】:

      【解决方案6】:

      尝试这个

      BigDecimal bd = new BigDecimal(Double.toString(number));
      bd = bd.setScale(decimalPlaces, RoundingMode.HALF_UP);
      return bd.doubleValue();
      

      【讨论】:

        【解决方案7】:

        无需更改数字(因此其当前精度仍可用于后续计算),您可以按如下方式控制显示。

        double v = 68.65121847597993;
        System.out.printf("%.1f%n", v);
        

        印刷

        68.7
        

        【讨论】:

          猜你喜欢
          • 2020-10-30
          • 2020-09-25
          • 1970-01-01
          • 1970-01-01
          • 2015-12-11
          • 2015-08-10
          • 1970-01-01
          • 2011-10-04
          • 1970-01-01
          相关资源
          最近更新 更多