代码之家  ›  专栏  ›  技术社区  ›  eyes enberg

如果四舍五入到小数点后1位,对基本整数除法使用BigDecimal over double有什么用吗?

  •  -1
  • eyes enberg  · 技术社区  · 5 年前

    我处理的是钱,我有一个处理简单整数除法的方法。既然我必须以double的形式返回值,那么用BigDecimal混乱代码在这里有效吗?

    对于这样的情况,它被认为是更“正确”的选择吗?

    0 回复  |  直到 5 年前
        1
  •  2
  •   Basil Bourque    5 年前

    从不使用 double 带着钱

    你说:

    因为我必须以double的形式返回值

    双重的 when accuracy matters . 通常包括钱。

    所以如果你回来 双重的 你的问题毫无意义 . 你已经把准确的结果扔出了窗外。

    double x = 0.1 * 0.1 * 10 ;
    System.out.println( x ) ;
    

    0.10000000000000002

    把这种行为与 BigDecimal

    BigDecimal y = new BigDecimal( "0.1" ).multiply( new BigDecimal ( "0.1" ) ).multiply( new BigDecimal ( "10" ) ) ;
    System.out.println( y ) ;
    

    0.10

    看到这个了吗 run live at IdeOne.com

        2
  •  0
  •   Cardstdani    5 年前

    我认为如果你只处理1个小数位,使用double更有效,因为BigDecimal用于高精度的计算,小数位数要多得多。

    要正确使用double,我建议您在需要时使用DecimalFormat对值进行舍入,例如:

    double a = 10;
    double b = 3;
    DecimalFormat format = new DecimalFormat(".00");
    format.setRoundingMode(RoundingMode.UP);
    
    System.out.println(format.format(a / b));
    

    这段代码的输出将是3.34,因为DecimalFormat的格式是2位小数,舍入模式是向上舍入,我在这里留下几个链接,其中包含正确使用十进制格式和舍入模式进行计算所需的所有信息:

    https://docs.oracle.com/javase/7/docs/api/java/text/DecimalFormat.html

    https://docs.oracle.com/javase/7/docs/api/java/math/RoundingMode.html