在没有RoundingMode的BigDecimal数字中检索点后的数字

时间:2012-04-30 13:34:17

标签: java bigdecimal

如何在BigDecimal中仅保留3个值后的值?

我找到了一个解决方案但它需要一个RoundingMode

    BigDecimal d = BigDecimal.valueOf(0.5649);
    System.out.println(d.remainder(BigDecimal.ONE));
    System.out.println(d.remainder(BigDecimal.ONE).divide(BigDecimal.valueOf(1), 3, RoundingMode.CEILING));

我希望保持一个精确的数字,而不是四舍五入。

3 个答案:

答案 0 :(得分:4)

只需使用setScale和RoundingMode.DOWN

  

舍入模式向零舍入。切勿先增加数字   丢弃的部分(即截断)。

例如

BigDecimal.valueOf(0.5649).setScale(3, RoundingMode.DOWN)

答案 1 :(得分:0)

BigDecimal不适用于此类限制。只想要3位小数是一个奇怪的要求。也许你只想向用户提供3位小数?

如果是这样,我建议使用:java.text.DecimalFormat

如果你真的想确保你从不进行高于3小数的精确计算,我建议你做自己的代表/课程。在内部,您将值保存为long(或适当的类/基元),但值为实际值的1000倍。所有计算均使用内部表示完成,当要求输入值时,将内部值除以1000.0d并转换为double(或适当)并返回。

答案 2 :(得分:0)

我会使用double

double d = 0.5649;
d = (long) (d * 1000) / 1000.0; // round down.
System.out.println(d);

打印

0.564

d = (long) (d * 1000 + 0.5) / 1000.0; // round half up.