Format of BigDecimal number

前端 未结 4 1964
太阳男子
太阳男子 2020-12-19 20:08
BigDecimal val = BigDecimal.valueOf(0.20);
System.out.println(a);

I want to store in val a value 0.20 and not 0.2. What I

相关标签:
4条回答
  • 2020-12-19 20:39

    You could use the String constructor of BigDecimal. It preserves the scale (which is what you want).

    BigDecimal val = new BigDecimal("0.20");
    

    See http://docs.oracle.com/javase/1.5.0/docs/api/java/math/BigDecimal.html#BigDecimal(java.lang.String)

    0 讨论(0)
  • 2020-12-19 20:49

    BigDecimal remembers the trailing zeros - with some significant side-effect:

    BigDecimal bd1 = new BigDecimal("0.20"); 
    BigDecimal bd2 = new BigDecimal("0.2");
    
    System.out.println(bd1);
    System.out.println(bd2);
    System.out.println(bd1.equals(bd2));
    

    will print

    0.20
    0.2
    false
    

    And we need to remember, that we can't use BiGDecimal for numbers, where the decimal expansion has a period:

    BigDecimal.ONE.divide(new BigDecimal(3));
    

    will throw an exception (what partially answers your concerns in your comments)

    0 讨论(0)
  • 2020-12-19 20:52

    EDIT: this answer is wrong as pointed out in the comments :| thx Andreas_D

    The problem is that there is no mathematical difference between 0.2 and 0.20 so your only chance is to display a certain number of digits after the decimal point. Once you store 0.2 or 0.20 in a BigDecimal they are indistinguishable from each other

    0 讨论(0)
  • 2020-12-19 20:56

    You're passing a double to BigDecimal.valueOf(). And 0.20 is exactly the same double as 0.2. Pass it a String, and the result will be different, because the scale of the BigDecimal will be deduced from the number of decimals in the String:

    BigDecimal bd1 = new BigDecimal("0.20");
    BigDecimal bd2 = new BigDecimal("0.2");
    
    System.out.println(bd1.toPlainString() + ", scale = " + bd1.scale()); // 0.20, scale = 2
    System.out.println(bd2.toPlainString() + ", scale = " + bd2.scale()); // 0.2, scale = 1
    
    NumberFormat nf = NumberFormat.getInstance();
    
    nf.setMinimumFractionDigits(bd1.scale());
    System.out.println(nf.format(bd1)); // 0,20 (in French locale)
    
    nf.setMinimumFractionDigits(bd2.scale());
    System.out.println(nf.format(bd2)); // 0,2 (in French locale)
    
    0 讨论(0)
提交回复
热议问题