为什么bigdecimal scale不能在java中工作?

jfgube3f  于 2021-07-03  发布在  Java
关注(0)|答案(2)|浏览(413)

关闭。这个问题需要细节或清晰。它目前不接受答案。
**想改进这个问题吗?**通过编辑这个帖子来添加细节并澄清问题。

25天前关门了。
改进这个问题
我在努力得到正确的结果 BigDecimal 几个小时。
我的电话号码是7.7049。我想把第一轮改为3位数。我要7.705英镑。再把这个四舍五入到2位数。我应该得到7.71分。
我试过这个:

BigDecimal(result).setScale(2, RoundingMode.HALF_UP) //instead of 2 can be any other number

但我打错电话了: 7.70 .
我试过不同的模式。我也试过了 valueOf(result.toDouble()) 什么都不管用。这里的问题看起来像 setScale 仅使用后两位数字 . 无视他人。
我怎样才能解决这个问题?
更新时间:
更多示例:
7.7019必须是7.70 | 7.7052必须是7.71 | 7.7071必须是7.71 | 7.7030必须是7.70

3hvapo4f

3hvapo4f1#

你可以先四舍五入前三位,然后再四舍五入前两位来得到你想要的。

BigDecimal a = new BigDecimal("7.7039")
    .setScale(3, RoundingMode.HALF_UP)
    .setScale(2, RoundingMode.HALF_UP);

结果与您的测试用例兼容。我没有对负数进行过测试,对于任意精度的数字,它可能不会产生预期的结果。
你可以参考文件的舍入模式,并使用这个想法,也许想出一个方案,舍入数字在非标准的方式你想要的。

ct3nt3jp

ct3nt3jp2#

问题很简单。我的电话号码是7.7049。当我想四舍五入到3位数之后。我将得到7.705,但当我将这个四舍五入更多,到2位数,我应该看到7.71。
你已经提到了你需要做的事情,即先用音阶旋转 3 然后用天平 2 .
演示:

import java.math.BigDecimal;
import java.math.RoundingMode;

public class Main {
    public static void main(String[] args) {
        System.out.println(roundNumber(7.7019, 3, 2));
        System.out.println(roundNumber(7.7052, 3, 2));
        System.out.println(roundNumber(7.7071, 3, 2));
        System.out.println(roundNumber(7.7030, 3, 2));
        System.out.println(roundNumber(7.7049, 3, 2));
        System.out.println(roundNumber(7.7039, 3, 2));
    }

    static BigDecimal roundNumber(double num, int scaleRound1, int scaleRound2) {
        return new BigDecimal(num).setScale(scaleRound1, RoundingMode.HALF_UP).setScale(scaleRound2,
                RoundingMode.HALF_UP);
    }
}

输出:

7.70
7.71
7.71
7.70
7.71
7.70

相关问题